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

时间:2015-10-21 11:36:48

标签: c# .net wcf json.net postsharp

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

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

这样可行,但有时参数非常大,例如一个自定义类,带有几个带有照片,指纹的字节数组等。我想从序列化中排除所有这些字节数组数据类型,那将是什么最好的办法吗?

序列化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属性。

3 个答案:

答案 0 :(得分:6)

以下内容允许您排除要从生成的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"
}

可在此处找到更多信息:

Reducing Serialized JSON Size

答案 1 :(得分:3)

您可以将[JsonIgnore]用于此特定属性。

listX

否则你也可以试试这个:Exclude property from serialization via custom attribute (json.net)

答案 2 :(得分:-1)

尝试使用JsonIgnore属性。