在C#中浏览动态对象(json)

Yoo*_*omi 6 c# json.net

我从HTTP GET请求获得一个json,看起来像用"NewtonSoft.Json"解析后:

dynamic data = JsonConvert.DeserializeObject(responseString);
Run Code Online (Sandbox Code Playgroud)

responseString的位置是:

{"name1":{"id":123456789,"name":"nickname","profileIconId":1114,"summonerLevel":30}}
Run Code Online (Sandbox Code Playgroud)

如您所见,名称每次都会更改,我想知道如何data.name1.name在每次更改name1时更改这一点.

如果json看起来像我怎么办:

{"name1":{"id":123456789,"name":"nickname","profileIconId":1114,"summonerLevel":30},"name2":{"id":123456789,"name":"nickname","profileIconId":948,"summonerLevel":30}}
Run Code Online (Sandbox Code Playgroud)

Dav*_*d L 5

您可以反序列化为JObject而不是动态序列,这使您可以访问方便的属性,例如First,使您可以在不知道属性名称的情况下向下浏览对象结构,并data根据您的编辑使用foreach循环遍历对象。

一旦达到所需的级别,就可以使用ToObject扩展方法将JObject解析为强类型。

请注意,您需要包括Newtonsoft.Json.Linq名称空间。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

void Main()
{
    var responseString = "{\"name1\":{\"id\":123456789,\"name\":\"nickname\",\"profileIconId\":1114,\"summonerLevel\":30},\"name2\":{\"id\":123456789,\"name\":\"nickname\",\"profileIconId\":948,\"summonerLevel\":30}}";
    JObject data = JsonConvert.DeserializeObject<JObject>(responseString);
    var names = new List<Name>();

    foreach (var x in data) names.Add(x.Value.ToObject<Name>());
    names.Dump();
}

public class Name
{
    public int id { get; set; }
    public string name { get; set; }
    public int profileIconId { get; set; }
    public int summonerLevel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果愿意LINQ,您可以随时根据上的Values()方法检索值,JObject然后选择每个成员。

var names = data.Values().Select(x => x.ToObject<Name>()).ToList();
Run Code Online (Sandbox Code Playgroud)

这将导致以下Name对象集合。

在此处输入图片说明