有没有办法使用 Newtonsoft 将编号 JSON 字段反序列化为 C# List 字段?

Is there a way to deserialize numbered JSON fields to a C# List field using Newtonsoft?

示例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 解析方法

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"
  ]
}

您可以通过添加 Dictionary<string,object> 类型的 属性 并用 [JsonExtensionData] 属性修饰来反序列化 Json。然后,您可以使 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);

输出