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

时间:2015-12-14 10:23:19

标签: c# json deserialization

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

e.g。

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

2 个答案:

答案 0 :(得分:0)

假设你有一个像

这样的课程
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

答案 1 :(得分:0)

您可以使用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);