【问题标题】:Deserialize inconsistent JSON property (nested object in an array) [duplicate]反序列化不一致的 JSON 属性(数组中的嵌套对象)[重复]
【发布时间】:2020-07-23 22:53:34
【问题描述】:

我正在尝试反序列化第三方提供的包含不一致属性的 JSON 文件。我正在使用 Newtonsoft.Json。不幸的是,我无法控制这些文件的创建,所以我只能处理所提供的内容。

我已经为此文件中的另一个问题提供了解决方案,该解决方案在此处记录/回答 Deserialize inconsistent JSON property,这是我在此文件中确定的最后一个问题。我相信这个问题可以用同样的方式处理,但是我正在努力解决它。

这个问题如下。

该文件包含以下属性:

"rolePerson": [
    {
      "firstName": "John",
      "lastName": "Doe",
      "middleNames": "Smith",
      "title": "mr"
    }
  ]

但有时该文件包含:

  "rolePerson": [
    {
      "rolePerson": {
         "firstName": "John",
         "lastName": "Doe",
         "middleNames": "Smith",
         "title": "mr"
      }
    }
  ]

我需要做的是,每当发生上述第二种情况时,对象内容就会像第一种情况一样反序列化。即“内部”对象包装器被丢弃/忽略,仅处理“内部”对象内容。

这是一个棘手的情况,但我相信结合上述链接解决方案中提供的方法可以以某种方式加以利用。

【问题讨论】:

  • 在这种情况下,有什么可靠的方法来检测数组项对象是否是需要丢弃的包装器?是否该项目只有一个属性,其值是另一个对象?是否该项目具有与外部数组同名的属性?还是其他一些标准?
  • 嗨@BrianRogers,最可靠的方法是该项目具有与外部数组同名的属性。上面显示的第二种情况是文件中提供的唯一不一致的方式。否则,它就像第一种情况显示的那样,或者是一个空数组。感谢您抽出宝贵时间!
  • 假设我们用RolePerson POCO 对常规"rolePerson" 建模,嵌套属性是否总是一些固定名称,这里是"rolePerson"?或者同一个 POCO 是否可以有不同的包装名称,具体取决于它的使用位置?
  • 因为如果名称 "rolePerson" 是固定的,您可以只使用私有 set-only 属性来绑定其值,请在此处查看此演示小提琴:dotnetfiddle.net/DCrxV7。在这种情况下不需要转换器。
  • 感谢 @dbc 的评论和示例小提琴。这解决了我的问题。我已经发布了你对这个问题的回答,并提到了你的认可。

标签: c# json json.net deserialization json-deserialization


【解决方案1】:

感谢 dbc 的评论回复,我能够根据他们的建议解决这个问题。

作为参考,对我的 RolePerson 类的修改来处理这个问题如下

public class RolePerson    
{
    [JsonProperty("rolePerson")]
    RolePerson NestedSerialization 
    {
        set
        {
            this.firstName = value?.firstName;
            this.lastName = value?.lastName;
            this.middleNames = value?.middleNames;
            this.title = value?.title;
        }
    }
    
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public string middleNames { get; set; } 
    public string title { get; set; } 
}

可以看到他们演示小提琴的链接here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多