Newtonsoft Json de-serealization不会忽略null

时间:2016-07-25 11:25:51

标签: c# json json.net

我有以下JSON

{
  "PROPERTY1": "vvv",
  "PROPERTY2": "aa",
}

我想用以下数据模型类反序列化

public class Class1
{
    public Class1()
    {

    }

    [JsonProperty(Required = Required.Always)]
    public string PROPERTY1{ get; set; }

    [JsonProperty(Required = Required.Always)]
    public string PROPERTY2{ get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public decimal PROPERTY3 { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string PROPERTY4 { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public SomeObject PROPERTY5 { get; set; }

}

并使用以下序列化代码

deserializedResponse = JsonConvert.DeserializeObject<Class1>(response);

因此我希望收到带有PROPERTY1和PROPERTY2的Class1, 实际上,当PROPERTY3为0时,我得到所有4个属性,PROPERTY4 = null,PROPERTY5 =&#34;&#34;。

尝试将序列化设置作为2参数传递

  JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings
    {       
        NullValueHandling = NullValueHandling.Ignore
    };

没有帮助。

我希望Class1对象没有PROPERTY3,如果它们不存在于JSON中,则需要PROPERTY4和PROPERTY5

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public decimal PROPERTY3 { get; set; }

您的属性是值类型。那就是它总是有价值的。它得到一个0,当你分配时它会改变。您必须转换为Nullable类型才能使该属性变为null。

您也可以使用动态。见这里:Deserialize json object into dynamic object using Json.net

这允许您仅使用存在的属性。其他问题的答案解释了如何检查属性是否存在:How do I check if a property exists on a dynamic anonymous type in c#?

答案 1 :(得分:1)

如果你不想要PROPERTY3和PROPERTY4,如果他们不在json中,你应该像这样反序列化:

deserializedResponse = JsonConvert.DeserializeObject<object>(response, jsonSerializerSettings);

我的意思是代替反序列化到class1,你应该反序列化为通用对象。我对这个porpouse不太确定。

答案 2 :(得分:1)

在这种情况下,您应该创建一个继承:

带有PROPERTY1和PROPERTY2的

Class1

Class2,派生于Class1,包含PROPERTY3,PROPERTY4和PROPERTY5。

NullValueHandling仅用于序列化目的。