将具有增量名称的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"}]
}
}
假设你有一个类似的类
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-0
、object-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);