使用Json.net - c#对象的部分自定义序列化

时间:2011-03-23 11:08:48

标签: c# serialization json.net

我使用Newtonsofts的Json.Net将一些对象数组序列化为json。 对象具有一组共同的属性,但也具有Meta属性,即字典

在序列化期间,我希望将键值对添加到我的json对象中,就像它们在根级别属性中一样,就像这样......

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

不喜欢这样:

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

我已经挖过JsonSerializerSettings,但似乎无法发现我可以跳进去并覆盖???

3 个答案:

答案 0 :(得分:4)

您可以通过创建自己的JsonConverter然后向要序列化的类添加属性来执行此操作 [JsonConverter(typeof(MyConverter))]

此处示例 - http://www.lostechies.com/blogs/rhouston/archive/2008/02/25/a-custom-converter-for-json-net.aspx

答案 1 :(得分:2)

如果您的词典是stringobject词典,则只需使用[JsonExtensionData]属性:

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

请参阅How to serialize a Dictionary as part of its parent object using Json.Net

答案 2 :(得分:0)

您可以使用the .Net DataContractJsonSerializer

有关自定义序列化,请参阅:

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

使用IDataContractSurrogate的一个优点(与简单地为类进行序列化添加属性相比)的一个优点是,您不必在同一个类中将实际属性和序列化属性混合在一起。

另一个优点(与必须对属性包进行自定义序列化相比,ala KeyValuePairConverter)是你只需要为类的属性添加属性(实际类型和代理类型),你可以直接针对这些类型编写所有转换/自定义序列化代码。这使您的代码保持更高级别,并让框架处理确切的传输机制。