如何从json序列化中排除特定类型



我将所有对WCF web服务的请求(包括参数)记录到数据库中。我是这样做的:

  • 创建一个类WcfMethodEntry,它派生自PostSharp的aspect OnMethodBoundaryAspect,
  • 用WcfMethodEntry属性注释所有WCF方法,
  • 在WcfMethodEntry中,我用JsonConvert将方法参数序列化为json。SerializeObject方法并将其保存到数据库。

这工作正常,但有时参数相当大,例如一个自定义类与几个字节数组的照片,指纹等。我想从序列化中排除所有字节数组数据类型,最好的方法是什么?

json序列化示例:

[
   {
      "SaveCommand":{
         "Id":5,
         "PersonalData":{
            "GenderId":2,
            "NationalityCode":"DEU",
            "FirstName":"John",
            "LastName":"Doe",
         },
         "BiometricAttachments":[
            {
               "BiometricAttachmentTypeId":1,
               "Parameters":null,
               "Content":"large Base64 encoded string"
            }
         ]
      }
   }
]
所需输出:

[
   {
      "SaveCommand":{
         "Id":5,
         "PersonalData":{
            "GenderId":2,
            "NationalityCode":"DEU",
            "FirstName":"John",
            "LastName":"Doe",
         },
         "BiometricAttachments":[
            {
               "BiometricAttachmentTypeId":1,
               "Parameters":null,
               "Content":"..."
            }
         ]
      }
   }
]

编辑:我不能改变被用作web服务方法参数的类-这也意味着我不能使用JsonIgnore属性。

下面的命令允许您从生成的json中排除您想要排除的特定数据类型。它的使用和实现非常简单,并改编自底部的链接。

你可以使用这个,因为你不能改变实际的类:

public class DynamicContractResolver : DefaultContractResolver
{
    private Type _typeToIgnore;
    public DynamicContractResolver(Type typeToIgnore)
    {
        _typeToIgnore = typeToIgnore;
    }
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
        properties = properties.Where(p => p.PropertyType != _typeToIgnore).ToList();
        return properties;
    }
}

用法和示例:

public class MyClass
{
    public string Name { get; set; }
    public byte[] MyBytes1 { get; set; }
    public byte[] MyBytes2 { get; set; }
}
MyClass m = new MyClass
{
    Name = "Test",
    MyBytes1 = System.Text.Encoding.Default.GetBytes("Test1"),
    MyBytes2 = System.Text.Encoding.Default.GetBytes("Test2")
};

JsonConvert.SerializeObject(m, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new DynamicContractResolver(typeof(byte[])) });
输出:

{
  "Name": "Test"
}

更多信息可以在这里找到:

减少序列化JSON的大小

您可以使用[JsonIgnore]来指定这个属性。

[JsonIgnore]
public Byte[] ByteArray { get; set; }
通过自定义属性(json.net)
将属性从序列化中排除

另一种方法是使用自定义类型转换器并让它返回null,因此属性在那里,但它将只是null。

例如,我使用这个,以便我可以序列化异常:

/// <summary>
/// Exception have a TargetSite property which is a methodBase.
/// This is useless to serialize, and can cause huge strings and circular references - so this converter always returns null on that part.
/// </summary>
public class MethodBaseConverter : JsonConverter<MethodBase?>
{
    public override void WriteJson(JsonWriter writer, MethodBase? value, JsonSerializer serializer)
    {
        // We always return null so we don't object cycle.
        serializer.Serialize(writer, null);
    }
    public override MethodBase? ReadJson(JsonReader reader, Type objectType, MethodBase? existingValue, bool hasExistingValue,
        JsonSerializer serializer)
    {
        return null;
    }
}

尝试使用JsonIgnore属性

相关内容

  • 没有找到相关文章

最新更新