2012-08-26 74 views
1

我正在使用Json.NET,并且我有以下代码。JSON.NET自定义序列化以排除属性名称

public class Row 
{ 
    [JsonProperty] 
    public IDictionary<string, object> Cells { get; set; } 
} 

行和细胞是动态生成的,我不得不C#动态/ Expando的功能创建的那些细胞。当Json.NET序列化动态实例时,它会生成我想要的正确的json结构。但是,对于大型数据结构,它会对性能产生不利影响。例如,JsonSerializer在序列化期间相当广泛地调用DynamicObject TryGetMember。因此我需要一个静态数据结构,所以序列化会更快。合成的Expando对象仍然会创建动态属性,但我希望Json.NET序列化使用静态结构(基于动态结构创建),因此序列化会更快。

根据动态结构填充单元字典并通过调用JsonConvert生成序列化的json结构,如下所示。

string serializeObject = JsonConvert.SerializeObject(data, Formatting.Indented); 

// JSON输出:

{ 

    "Data": [ 
       { 
       "Cells": { 
        "column1": "20", 
        "column2": "20" 
        } 
       }, 
       { 
       "Cells": { 
        "column1": "20", 
        "column2": "20" 
        } 
       } 
     ] 
} 

然而UI电网这我结合,需要以下JSON结构

"Data": [ 
       { 
        "column1": "20", 
        "column2": "20"     
       }, 
       {     
        "column1": "20", 
        "column2": "20"     
       } 
      ] 

有没有一种方法,我可以删除“细胞”并产生如上的Json结构?

我看着JSON.NET帮助docos,我找不到一种方法来实现这一点。 还试图重写DynamicContractResolver的CreateProperty方法,看看我是否可以更改序列化的行为,但我无法做到这一点

public class DynamicContractResolver : DefaultContractResolver 
{  
    protected override JsonProperty CreateProperty(System.Reflection.MemberInfo member, MemberSerialization memberSerialization) 
    { 
     if (member.Name == "Cells") 
     { 
      //remove the name "Cells" from the serialized structure  
     } 
     return base.CreateProperty(member, memberSerialization); 
    } 
} 

或者,这不是简单的支持?任何建议或方向非常赞赏。

回答

4

找到一种通过创建自定义转换器来解决此问题的方法。下面的代码产生我需要的Json结果。

public class GridJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return true; //TODO: more logic check the type before the conversion.. 
    } 

    public override void WriteJson(JsonWriter writer, 
     object value, JsonSerializer serializer) 
    { 
     var rows = (List<Row>)value; 

     writer.WriteStartObject(); 
      writer.WritePropertyName("data"); 
       writer.WriteStartArray(); 

     foreach (var row in rows) 
     { 
      writer.WriteStartObject(); 
      var cells = row.Cells; 

      foreach (var cell in cells) 
      { 
       writer.WritePropertyName(cell.Key); 
       writer.WriteValue(cell.Value);  
      } 

      writer.WriteEndObject(); 
     } 

     writer.Flush(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, 
     object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

//用例:

string serializeObject = JsonConvert.SerializeObject 
(someData, Formatting.Indented, new GridJsonConverter()); 
相关问题