将具有增量名称的JSON对象映射到C#模型

本文关键字:对象 JSON 映射 模型 | 更新日期: 2023-09-27 18:26:38

映射一个JSON对象的最佳方法是什么?该对象具有一个包含对象列表的结构,这些对象的名称是通过增量动态创建的?

例如

{"data":
 {
  "object-0":[{"id":"1","name":"John"},{"id":"2","name":"Mary"}],
  "object-1":[{"id":"3","name":"Gary"},{"id":"4","name":"Mark"}]
 }
}

将具有增量名称的JSON对象映射到C#模型

假设你有一个类似的类

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

您可以将其反序列化为类似Dictionary<string, IEnumerable<User>>

Dictionary<string, IEnumerable<User>> values =
    JsonConvert.DeserializeObject<Dictionary<string, IEnumerable<User>>>(json);

这也假设使用json.net

您可以使用Json.NET库将任何Json字符串转换为.NET中的任意动态对象

dynamic jsonObject = JsonConvert.DeserializeObject(jsonString);

在您的情况下,我假设您需要列表/数组中的object-0object-1等(因为它们是由其外观增量生成的),而不是像这样的类型化属性,在这种情况下,您可以简单地将获得的动态对象转换为您想要的任何对象。对于例如

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Data
{
    public Dictionary<string, List<User>> Objects { get; set; }
}
string jsonString = '...';
dynamic jsonObject = JsonConvert.DeserializeObject(jsonString);
// could have made use of LINQ to shorten this bit of code 
// but unfortunately dynamic doesn't play well with extension methods
var data = new Data { Objects = new Dictionary<string, List<User>>() };
foreach (var obj in jsonObject.data) 
    data.Objects[obj.Name] = obj.Value.ToObject<List<User>>();
// now you have everything in `data` instance.

要复制确切的json结构,可以有一个根类来保存数据。类似于:

class Root { public Data data { get; set; } }
var root = new Root { data = data };

如果你需要将整个用户对象放在一个平面结构中,你也可以将其平面化:

var users = data.Objects.SelectMany(kv => kv.Value);