在C#中遍历动态对象(json)

10

我收到了一个 HTTP GET 请求返回的 JSON 数据,使用 "NewtonSoft.Json" 解析后,看起来是这样的:

dynamic data = JsonConvert.DeserializeObject(responseString);

responseString是什么:

{"name1":{"id":123456789,"name":"nickname","profileIconId":1114,"summonerLevel":30}}

如你所见,名称每次都会更改,我想知道如何像 data.name1.name 这样导航,其中 name1 每次都会更改。

如果 JSON 如下所示,我该怎么做:

{"name1":{"id":123456789,"name":"nickname","profileIconId":1114,"summonerLevel":30},"name2":{"id":123456789,"name":"nickname","profileIconId":948,"summonerLevel":30}}
1个回答

9
您可以将反序列化对象的类型从dynamic更改为JObject,这将使您能够访问方便的属性,例如First,它允许您在不知道属性名称的情况下沿着对象结构向下遍历,并且可以根据您的编辑使用foreach循环迭代data上的对象。
一旦达到所需级别,您就可以使用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; }
}

如果您喜欢使用LINQ,您可以始终使用JObject上的Values()方法检索值并选择每个成员。
var names = data.Values().Select(x => x.ToObject<Name>()).ToList();

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

在此输入图像描述


哦,不错,我会去看看的! - Yooooomi
感谢您花费时间帮助我 :D - Yooooomi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接