【问题标题】:Newtonsoft Json de-serealization does not ignores nullsNewtonsoft Json 反序列化不会忽略空值
【发布时间】:2016-11-28 17:18:47
【问题描述】:

我有以下 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, 实际上我得到了所有 4 个属性,而 PROPERTY3 为 0,PROPERTY4 = null,PROPERTY5 = ""。

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

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

没有帮助。

如果 JSON 中不存在,我想要没有 PROPERTY3 和 PROPERTY4 和 PROPERTY5 的 Class1 对象

有什么建议吗?

【问题讨论】:

  • 有什么问题?当然,您仍将拥有它们属于类的那些属性。他们只会有他们的默认值(因此null0)。 null 处理用于序列化,写出时将被忽略。如果您想要动态类型,请使用 dynamic 而不是具体类。
  • 另外,您的 JSON 无效。应该是 { "PROPERTY1":"vvv", "PROPERTY2":"aa" }
  • @Lloyd Typo :-) 如果 JSON 中不存在,我想要没有 PROPERTY3 和 PROPERTY4 的 Class1 对象
  • @AlexanderGorelik 然后尝试dynamic,因为您无法从临时课程中删除属性-stackoverflow.com/questions/4535840/…
  • @AlexanderGorelik 你不可能是其中一个,我害怕。

标签: c# json json.net


【解决方案1】:
[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#?

【讨论】:

  • 或者使用 DefaultValueHandling。
  • @Sascha 我想要没有 PROPERTY3 和 PROPERTY4 和 PROPERT5 的 Class1 对象,如果它们不存在于 JSON 中。
  • @AlexanderGorelik 提供了如何检查动态属性存在的链接
【解决方案2】:

如果您不想要 PROPERTY3 和 PROPERTY4(如果它们不在 json 中),您应该像这样反序列化:

deserializedResponse = JsonConvert.DeserializeObject(response, jsonSerializerSettings);

我的意思是,您应该反序列化为通用对象,而不是反序列化为 class1。我只是不确定海豚。

【讨论】:

  • 在类 1 中,Property1 和 Property2 是必需的,其他属性是可选的。如果前两个不存在,我将抛出异常,并检查其他 3 个以完成我的验证过程。我想检查属性是否存在而不是它们的值。
  • @AlexanderGorelik 即使这样,您也应该使用 Nullable 类型或默认值处理。其他一切都是反射或动态编程,这可能是一个严重的性能问题......
【解决方案3】:

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

Class1 与 PROPERTY1 和 PROPERTY2。

Class2,从具有 PROPERTY3、PROPERTY4 和 PROPERTY5 的 Class1 派生。

NullValueHandling 仅用于序列化目的。

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    相关资源
    最近更新 更多