当使用Json.NET序列化时如何忽略特定的数据类型?

7

我正在将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

3个回答

6
您可以使用自定义的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


0

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

public class Plane
{
  // included in JSON
  public string Model { get; set; }
  public DateTime Year { get; set; }

  // ignored
  [JsonIgnore]
  public DateTime LastModified { get; set; }
}

我知道,但我必须浏览数十个包含大量Guid的类! - mshwf
那么你应该将这个内容添加到你的问题中。不更改类,你应该能够使用自定义合同解析器来完成它,就像这里所描述的一样:https://dev59.com/Gl8e5IYBdhLWcg3wcKAq#25769147 - André

0

你可以创建自己的转换器

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,如何自定义序列化以插入JSON属性

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接