【问题标题】:Ignoring specific data type when serializing with Json.NET?使用 Json.NET 序列化时忽略特定数据类型?
【发布时间】:2018-01-16 02:44:28
【问题描述】:

我正在将 JSON 对象保存到数据库中,有时它会变得非常大(我有一个长度为 205,797 个字符的对象)我想尽可能地消除大小。这些对象有很多 GUID 字段,我不需要,如果有办法忽略序列化中的任何 GUID 类型,它可能有助于消除大小。

这是我的代码,我在我的应用程序中传递了任何模型类型的对象:

 public static string GetEntityAsJson(object entity)
 {
     var json = JsonConvert.SerializeObject(entity, Formatting.None, new JsonSerializerSettings
     {
         ReferenceLoopHandling = ReferenceLoopHandling.Ignore
     });
     return json;
}

编辑

我不想使用JsonIgnore 属性,因为我必须将它添加到这么多类中,每个类都有很多 GUID 属性, 我正在寻找直截了当的东西,例如: IgnoreDataType = DataTypes.GUID

【问题讨论】:

    标签: c# json serialization json.net deserialization


    【解决方案1】:

    您可以使用自定义ContractResolver 来忽略所有类中特定数据类型的所有属性。例如,这里是忽略所有Guids

    class IgnoreGuidsResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            JsonProperty prop = base.CreateProperty(member, memberSerialization);
            if (prop.PropertyType == typeof(Guid))
            {
                prop.Ignored = true;
            }
            return prop;
        }
    }
    

    要使用解析器,只需将其添加到您的JsonSerializerSettings

    var json = JsonConvert.SerializeObject(entity, Formatting.None, new JsonSerializerSettings
    {
        ContractResolver = new IgnoreGuidsResolver(),
        ...
    });
    

    演示小提琴:https://dotnetfiddle.net/lOOUfq

    【讨论】:

      【解决方案2】:

      在您的实体类中使用[JsonIgnore] 应该可以解决您的问题。

      public class Plane
      {
        // included in JSON
        public string Model { get; set; }
        public DateTime Year { get; set; }
      
        // ignored
        [JsonIgnore]
        public DateTime LastModified { get; set; }
      }
      

      【讨论】:

      • 我知道,但我得上几十个有很多指导的课程!
      • 那么您应该将其添加到您的问题中。在不更改类的情况下,您应该能够使用此处描述的自定义合同解析器来做到这一点:stackoverflow.com/a/25769147/715348
      【解决方案3】:

      您可以创建自己的转换器

      public class MyJsonConverter : JsonConverter
      {
          public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
          {
      
              JObject jo = new JObject();
      
              foreach (PropertyInfo prop in value.GetType().GetProperties())
              {
                  if (prop.CanRead)
                  {
                      if (prop.PropertyType == typeof(Guid))
                          continue;
      
      
                      object propValue = prop.GetValue(value);
      
                      if (propValue != null)
                      {
                          jo.Add(prop.Name, JToken.FromObject(propValue));
                      }
                  }
              }
              jo.WriteTo(writer);
          }
      
          public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
          {
              throw new NotImplementedException();
          }
      
          public override bool CanConvert(Type objectType)
          {
              return objectType.IsAssignableFrom(objectType);
          }
      }
      

      并将其用作

      static void Main(string[] args)
          {
              Person testObj = new Person
              {
                  Id = Guid.NewGuid(),
                  Name = "M.A",
                  MyAddress = new Address
                  {
                      AddressId = 1,
                      Country = "Egypt"
                  }
              };
      
              var json = JsonConvert.SerializeObject(testObj, new MyJsonConverter());
      
              Console.WriteLine(json);
          }
      

      public class Person
      {
          public Guid Id { get; set; }
      
          public string Name { get; set; }
      
          public Address MyAddress { get; set; }
      
      }
      
      public class Address
      {
          public int AddressId { get; set; }
      
          public string Country { get; set; }
      
      }
      

      我使用这个参考来创建转换器 Json.NET, how to customize serialization to insert a JSON property

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多