【问题标题】:Is there a way to deserialize numbered JSON fields to a C# List field using Newtonsoft?有没有办法使用 Newtonsoft 将编号的 JSON 字段反序列化为 C# 列表字段?
【发布时间】:2022-01-21 17:58:20
【问题描述】:

示例 JSON:

{
    "name": "John Smith",
    "pet1_name": "Fido",
    "pet2_name": "Fluffy",
    "pet3_name": "Killer"
}

我正在寻找的是使用 Newtonsoft 将其反序列化为看起来像这样的对象的最简单方法:

public class Person {
    public string Name { get; set; }
    public List<string> PetNames { get; set; }
}

如果可能的话,我最好避免创建名为“Pet1Name”、“Pet2Name”等的单独属性,并在反序列化后将它们组合成一个列表。

【问题讨论】:

  • json 不能只显示一个数组吗?你控制输入吗?
  • 不幸的是,我不能。输入来自我无法控制的 API。

标签: c# json json.net


【解决方案1】:

你可以使用json解析方法

var jasonObject=JObject.Parse(json);

var person = new Person
{
Name = (string)jsonObject["name"],
PetNames = jsonObject.Properties().Where(p => p.Name != "name").Select(p => (string)p.Value).ToList()
};

或者你可以使用json反序列化方法(不像上一个那样灵活快速)

var result = JsonConvert.DeserializeObject<JsonPerson>(json);

var person = new Person {Name=result.Name, 
PetNames=result.PetNamesExt?.Values.Select(x=>x.ToString()).ToList()};

public class Person
{
    public string Name { get; set; }

    [JsonIgnore]
    public List<string> PetNames {get; set;}

}
public class JsonPerson : Person
{
    [JsonExtensionData]
    public Dictionary<string, object> PetNamesExt { get; set; }
}

输出

{
  "Name": "John Smith",
  "PetNames": [
    "Fido",
    "Fluffy",
    "Killer"
  ]
}

【讨论】:

    【解决方案2】:

    您可以通过添加Dictionary&lt;string,object&gt; 类型的属性来反序列化Json,并使用[JsonExtensionData] 属性进行修饰。然后,您可以使您的 PetNames 属性从字典中获取值。例如,

    public class Person 
    {
        public string Name { get; set; }
        public List<string> PetNames => PetNamesDictionary?.Values.Select(x=>x.ToString()).ToList();
        
        [JsonExtensionData]
        public Dictionary<string,object> PetNamesDictionary{get;set;}
    }
    
    var result = JsonConvert.DeserializeObject<Person>(json);
    

    输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-13
      • 2022-01-19
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多