{"id":1948,"date":"2017-01-02T22:58:26","date_gmt":"2017-01-02T22:58:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1948"},"modified":"2025-10-09T07:27:09","modified_gmt":"2025-10-09T14:27:09","slug":"using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/","title":{"rendered":"Using Jil for custom JSON Serialization in the Couchbase .NET SDK"},"content":{"rendered":"<p>One of the new features introduced in 2.1.0 of the Couchbase .NET SDK was support for overriding the default serializer with your own custom serializer by extending the ITypeSerializer interface and providing your own or favorite serializer. In this article we will show you how to do this and provide an example (clonable from <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-net-contrib\" target=\"_blank\" rel=\"noopener\">couchbase-net-contrib<\/a> project in <a href=\"https:\/\/github.com\/couchbaselabs\" target=\"_blank\" rel=\"noopener\">Couchbaselabs<\/a>) using a very fast JSON serializer called Jil.<\/p>\n<p>By default the .NET SDK uses the popular NewtonSoft.NET JSON serializer mainly because it\u2019s a feature complete, widely used and well-supported project. In general the performance provided by the NewtonSoft is good enough for most projects, in some cases however, you may want to use a faster JSON serializer like <a href=\"https:\/\/github.com\/kevin-montrose\/Jil\" target=\"_blank\" rel=\"noopener\">Jil<\/a>.<\/p>\n<p>Jil is based off of Sigil, a fail-fast IL generation library, and provides a general purpose JSON serializer which is highly optimized and uses a number of \u201ctricks\u201d to improve performance, like avoiding allocations (thus no GC\u2019s) and optimizing the member access order so the CPU doesn\u2019t need to stall while waiting for values in memory. You can read more about Jil and Sigil <a href=\"https:\/\/github.com\/kevin-montrose\/Jil\" target=\"_blank\" rel=\"noopener\">here <\/a>and <a href=\"https:\/\/github.com\/kevin-montrose\/Sigil\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n<h2>Steps Required<\/h2>\n<p>Extending the default serializer is relatively easy:<\/p>\n<ol>\n<li>First you provide your own implementation of Couchbase.Core.Serializaton.ITypeSerializer.<\/li>\n<li>Then override the DefaultSerializer in Couchbase.Configuration.Client.ClientConfiguration class. That\u2019s it!<\/li>\n<li>Optionally, you may wish to use the Web.Config or App.Config to register the new ITypeSerializer so that the SerializerFactory will create the serializer at run-time.<\/li>\n<\/ol>\n<h2>Implementing ITypeSerializer<\/h2>\n<p>The ITypeSerializer interface is used by the transcoder (ITypeTranscoder) for handling the serialization and deserialization of Memcached packet body. The transcoder uses the Type of the generic parameters of the operation, the OperationCode of the operation and the \u201cflags\u201d encoded within the Memcached header to determine what Type to de-serialize the body into and to determine which flags to encode the packet during serialization.<\/p>\n<p>While is seems complex, it\u2019s all really simple; if the Type of the body is an object or primitive (int, ulong,etc), the body is encoded with a JSON flag and treated as JSON. Yes, integers are treated as valid JSON! If the Type of the body is a string, it\u2019s treated as a string and UTF 8 encoded or decoded. Finally, byte arrays are passed straight through and simply appended to the packet or read from the packet and assigned to the Value field of the IOperationResult, if the operation has a body. So any value other than Strings and byte arrays will be serialized or deserialized using the ITypeSerializer.<\/p>\n<p>The ITypeSerializer has the following method signatures that you must implement:<\/p>\n<pre><code class=\"language-cs\">\r\n\r\npublic interface ITypeSerializer\r\n    {\r\n        T Deserialize(byte[] buffer, int offset, int length);\r\n\r\n        T Deserialize(Stream stream);\r\n\r\n        byte[] Serialize(object obj);\r\n    }\r\n\r\n <\/code><\/pre>\n<p>One overload for Deserialize takes a Stream and the other a byte array, offset and length. Serialize just takes a System.Object reference which is the value to serialize into a byte array for transport.<\/p>\n<p>The code listing for the JilSerializer looks like this:<\/p>\n<pre><code> \r\n\r\n    public class JilSerializer : ITypeSerializer\r\n    {\r\n        ...\r\n\r\n        public T Deserialize(Stream stream)\r\n        {\r\n            using (var reader = new StreamReader(stream))\r\n            {\r\n               return JSON.Deserialize(reader, _options);\r\n            }\r\n        }\r\n\r\n        public T Deserialize(byte[] buffer, int offset, int length)\r\n        {\r\n            T value = default (T);\r\n            if (length == 0) return value;\r\n            using (var ms = new MemoryStream(buffer, offset, length))\r\n            {\r\n                using (var sr = new StreamReader(ms))\r\n                {\r\n                    if (typeof(T).IsValueType &amp;&amp; (!typeof(T).IsGenericType\r\n                        || typeof(T).GetGenericTypeDefinition() != typeof(Nullable&lt;&gt;)))\r\n                    {\r\n                        var type = typeof (Nullable&lt;&gt;).MakeGenericType(typeof (T));\r\n                        object nullableVal = JSON.Deserialize(sr, type, _options);\r\n                        value = nullableVal == null ? default(T) : (T)nullableVal;\r\n                    }\r\n                    else\r\n                    {\r\n                        value = JSON.Deserialize(sr, _options);\r\n                    }\r\n                }\r\n            }\r\n            return value;\r\n        }\r\n\r\n        public byte[] Serialize(object obj)\r\n        {\r\n            using (var ms = new MemoryStream())\r\n            {\r\n                using (var sw = new StreamWriter(ms))\r\n                {\r\n                    JSON.Serialize(obj, sw, _options);\r\n                }\r\n                return ms.ToArray();\r\n            }\r\n        }\r\n    }\r\n<\/code><\/pre>\n<p>Note that the code is near identical to the DefaultSerializer logic with exception that we are using the Jil JSON class instead of the Newtonsoft.NET serialization classes; although the serialization mechanism is different the rules are the same.<\/p>\n<h2>Configuring the SDK to use the custom Serializer<\/h2>\n<p>As mentioned earlier, the Couchbase .NET SDK was updated in 2.1.0 to allow for custom serializers, this is done by overriding the default serializer factory in the ClientConfiguration, which is just a Func property: anything matching the signature will be created and used for serialization. On a side note, the SerializationSettings and DeserializationSettings have been deprecated and are no longer used.<\/p>\n<p>Here is an example:<\/p>\n<pre><code class=\"language-cs\">\r\n\r\nvar config = new ClientConfiguration\r\n{\r\n    Serializer = () =&gt; new JilSerializer()\r\n};\r\n \r\nvar cluster = new Cluster(config);\r\nvar bucket = cluster.OpenBucket();\r\n\r\n<\/code><\/pre>\n<p>While you can provide complex logic for the creation of the ITypeSerializer, the simplest approach is sufficient.<\/p>\n<p>If you wanted to use the SerializationFactory to instantiate the serializer, you would simply provide the initialization code in your Web.Config or App.Config:<\/p>\n<pre><code class=\"language-xml\"><!--?xml version=\"1.0\" encoding=\"utf-8\" ?--><\/code><\/pre>\n<p>To use the custom configuration in your code, you will call the CTOR of the Cluster class which takes a string path that matches your configuration:<\/p>\n<pre><code class=\"language-cs\">\r\nvar cluster = new Cluster(\"couchbaseClients\/couchbase\");\r\nvar bucket = cluster.OpenBucket();\r\n<\/code><\/pre>\n<p>Once you do this, any Buckets opened from the Cluster object will use the JilSerializer instead of the default NewtonSoft.NET serializer.<\/p>\n<h2>Conclusion<\/h2>\n<p>With the new extension points added to the Couchbase .NET SDK, it\u2019s trivial to write and use custom JSON serializers using the ITypeSerializer interface. The Jil JSON serializer looks impressive and is easy to use; I am hoping a community member will create one for ServiceStack.Text and push it to the Couchbase. NET Contrib Project!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the new features introduced in 2.1.0 of the Couchbase .NET SDK was support for overriding the default serializer with your own custom serializer by extending the ITypeSerializer interface and providing your own or favorite serializer. In this article [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,10127,2201],"tags":[1261,1430],"ppma_author":[8970],"class_list":["post-1948","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-c-sharp","category-tools-sdks","tag-json","tag-serialization"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jil for custom JSON Serialization in the Couchbase .NET SDK<\/title>\n<meta name=\"description\" content=\"How to override the default serializer with own custom JSON serializer Jil by extending the ITypeSerializer interface and providing own serializer.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Jil for custom JSON Serialization in the Couchbase .NET SDK\" \/>\n<meta property=\"og:description\" content=\"How to override the default serializer with own custom JSON serializer Jil by extending the ITypeSerializer interface and providing own serializer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-02T22:58:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-09T14:27:09+00:00\" \/>\n<meta name=\"author\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jeffrysmorris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/\"},\"author\":{\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\"},\"headline\":\"Using Jil for custom JSON Serialization in the Couchbase .NET SDK\",\"datePublished\":\"2017-01-02T22:58:26+00:00\",\"dateModified\":\"2025-10-09T14:27:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/\"},\"wordCount\":750,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"JSON\",\"serialization\"],\"articleSection\":[\".NET\",\"C#\",\"Tools &amp; SDKs\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/\",\"name\":\"Jil for custom JSON Serialization in the Couchbase .NET SDK\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-01-02T22:58:26+00:00\",\"dateModified\":\"2025-10-09T14:27:09+00:00\",\"description\":\"How to override the default serializer with own custom JSON serializer Jil by extending the ITypeSerializer interface and providing own serializer.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Jil for custom JSON Serialization in the Couchbase .NET SDK\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\",\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"caption\":\"Jeff Morris, Senior Software Engineer, Couchbase\"},\"description\":\"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).\",\"sameAs\":[\"https:\/\/x.com\/jeffrysmorris\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/jeff-morris\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Jil for custom JSON Serialization in the Couchbase .NET SDK","description":"How to override the default serializer with own custom JSON serializer Jil by extending the ITypeSerializer interface and providing own serializer.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/","og_locale":"en_US","og_type":"article","og_title":"Using Jil for custom JSON Serialization in the Couchbase .NET SDK","og_description":"How to override the default serializer with own custom JSON serializer Jil by extending the ITypeSerializer interface and providing own serializer.","og_url":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-01-02T22:58:26+00:00","article_modified_time":"2025-10-09T14:27:09+00:00","author":"Jeff Morris, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@jeffrysmorris","twitter_misc":{"Written by":"Jeff Morris, Senior Software Engineer, Couchbase","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/"},"author":{"name":"Jeff Morris, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341"},"headline":"Using Jil for custom JSON Serialization in the Couchbase .NET SDK","datePublished":"2017-01-02T22:58:26+00:00","dateModified":"2025-10-09T14:27:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/"},"wordCount":750,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["JSON","serialization"],"articleSection":[".NET","C#","Tools &amp; SDKs"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/","url":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/","name":"Jil for custom JSON Serialization in the Couchbase .NET SDK","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-01-02T22:58:26+00:00","dateModified":"2025-10-09T14:27:09+00:00","description":"How to override the default serializer with own custom JSON serializer Jil by extending the ITypeSerializer interface and providing own serializer.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/using-jil-for-custom-json-serialization-in-the-couchbase-net-sdk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using Jil for custom JSON Serialization in the Couchbase .NET SDK"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341","name":"Jeff Morris, Senior Software Engineer, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812","url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","caption":"Jeff Morris, Senior Software Engineer, Couchbase"},"description":"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).","sameAs":["https:\/\/x.com\/jeffrysmorris"],"url":"https:\/\/www.couchbase.com\/blog\/author\/jeff-morris\/"}]}},"authors":[{"term_id":8970,"user_id":21,"is_guest":0,"slug":"jeff-morris","display_name":"Jeff Morris, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","author_category":"","last_name":"Jeff Morris, Senior Software Engineer, Couchbase","first_name":"Jeff","job_title":"","user_url":"","description":"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language)."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1948","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1948"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1948\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=1948"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1948"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1948"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1948"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}