【问题标题】:Deserializing a list of objects creates a new object for an empty node .NET反序列化对象列表会为空节点 .NET 创建一个新对象
【发布时间】:2021-08-04 21:48:36
【问题描述】:

我有这个 JSON,它是一个对象列表,就像这样。

"Fields": [
    {
        "fieldID": 1,
        "name": "field"
    }
]

列表为空时,这样发送

"Fields": [
    {}
]

我将其作为字符串读入,然后尝试使用 JsonConvert.DeserializeObject<List<T>>(json); 对其进行反序列化,其中 T 是与字段模型匹配的对象。但是,当我这样做时,我会得到一个包含一个项目的新列表(计数 = 1,当它应该为 0 时),就像我反序列化这个 JSON 一样。

"Fields": [
    {
        "fieldID": 0,
        "name": null
    }
]

我怎样才能避免或解决这个问题?

【问题讨论】:

  • 是什么阻止你检查 if(Fields[0].name==null) Fields=null; ?
  • 只是额外的工作,我觉得应该被序列化程序捕获,固有地或通过设置。
  • 如果这对你来说太麻烦了,你可以创建一个自定义序列化器
  • '列表为空时,这样发送'"Fields": [ {} ]。它不是一个空列表。 这是一个包含一个元素的列表。空列表看起来像"Fields": [ ]。问题出在 JSON 中,而不是 JsonConvert.DeserializeObject 方法中。如果您无法修复 JSON,则只需检查第一个元素的属性并在属性具有默认值时将其删除。

标签: c# json .net


【解决方案1】:

后面的第一个json不代表空列表:

"Fields": [
    {}
]

json 中的空列表应如下所示:

"Fields": []

所以你应该尝试修复 json。但是,如果事实证明这是不可能的,您可以执行以下操作:

        using (JsonDocument document = JsonDocument.Parse(jsonString))
        {
            JsonElement root = document.RootElement;
            var l = root.EnumerateArray().First().ToString();
            if(l=="{}")
            {
              //do something
            }
        }

发生的事情是您只需解析 json 并枚举元素列表并检测“{}”是否存在。

或者,您可以采用更复杂的方法,即编写一个自定义转换器,以您想要的方式处理这种情况。您可以查看documentation here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2014-10-06
    • 2012-03-07
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多