简体   繁体   中英

Using Json.net - partial custom serialization of a c# object

I ma using Newtonsofts' Json.Net to serialize some and array of objects to json. The objects have a common set of properties but also have Meta property which is a dictionary

During serialization I want the key value pairs to be added to my json object as if they where root level properties, like this...

 {
    id: 1,
    name:'jeff',
    food:'spinch',
    spoon: 'ýes'
 }  

Not like this:

 {
    id: 1,
    name:'jeff',
    meta:{
       food:'spinch',
       spoon: 'ýes'
    }
 } 

I have dug through JsonSerializerSettings but cant seem to spot where I can jump in and override???

You can do this by creating your own JsonConverter and then adding an attribute to the class you want to serialize [JsonConverter(typeof(MyConverter))]

Example here - http://www.lostechies.com/blogs/rhouston/archive/2008/02/25/a-custom-converter-for-json-net.aspx

If your dictionary is a string to object dictionary could can simply use the [JsonExtensionData] attribute:

[JsonExtensionData]
public Dictionary<string, object> Meta { get; set; }

See How to serialize a Dictionary as part of its parent object using Json.Net .

You could use the .Net DataContractJsonSerializer .

For custom serialization, see:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx

One advantage of using IDataContractSurrogate (compared to simply adding properties to your class for serialization) is that you don't have to mix actual properties and serialization properties together in the same class.

Another advantage (compared to having to do custom serialization against a property bag, ala KeyValuePairConverter ) is that you only have to add attributes to properties on your classes (the actual type and the surrogate type) and you can write all your conversion/custom serialization code directly against those types. This keeps your code higher level, and lets the framework deal with the exact transport mechanism.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM