【问题标题】:JSON.NET customizing the serialization to exclude a property nameJSON.NET 自定义序列化以排除属性名称
【发布时间】:2012-08-26 05:04:41
【问题描述】:

我正在使用 Json.NET,我有以下代码。

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

行和单元格是动态生成的,我有 C# 动态/扩展功能来创建这些单元格。当 Json.NET 序列化动态实例时,它会生成我想要的正确 json 结构。但是,对于大型数据结构,它会对性能产生不利影响。例如,JsonSerializer 在序列化过程中非常广泛地调用 DynamicObject TryGetMember。因此我需要一个静态数据结构,这样序列化会快得多。 synamic Expando 对象仍会创建动态属性,但我希望 Json.NET 序列化使用静态结构(基于动态结构创建),因此序列化会快得多。

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

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

//json 输出:

 {

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

但是我绑定的 UI Grid 需要下面的 json 结构

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

有没有办法可以删除“单元”并生成上述 Json 结构?

我查看了 JSON.NET 帮助文档,但找不到实现此目的的方法。 还尝试覆盖 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);
    }
 }

或者这不是简单的支持?非常感谢任何建议或指示。

【问题讨论】:

    标签: serialization json.net


    【解决方案1】:

    通过创建自定义转换器找到了解决此问题的方法。下面的代码产生了我需要的 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2011-11-25
      相关资源
      最近更新 更多