如何循环使用C#中的嵌套JSON对象?
我正在从事一个C#项目,需要调用API并通过JSON响应进行解析 JSON响应:如何循环使用C#中的嵌套JSON对象?,c#,json,json.net,json-deserialization,C#,Json,Json.net,Json Deserialization,我正在从事一个C#项目,需要调用API并通过JSON响应进行解析 JSON响应: { "version": "3.9.1", "data": { "obj1": { "version": "1.0.0", "id": "obj1",
{
"version": "3.9.1",
"data": {
"obj1": {
"version": "1.0.0",
"id": "obj1",
"name": "Object 1",
"title": "Object 1",
"info": {
"info1": 8,
"info2": 4,
"info3": 3
},
"image": {
"full": "Object1.png",
"w": 64,
"h": 64
},
"tags": [
"Tag1",
"Tag2"
]
},
"obj2": {
"version": "1.0.0",
"id": "obj2",
"name": "Object 2",
"title": "Object 2",
"info": {
"info1": 1,
"info2": 6,
"info3": 7
},
"image": {
"full": "Object2.png",
"w": 64,
"h": 64
},
"tags": [
"Tag1",
"Tag6"
]
},
"obj3": {
"version": "1.0.0",
"id": "obj3",
"name": "Object 3",
"title": "Object 3",
"info": {
"info1": 0,
"info2": 1,
"info3": 2
},
"image": {
"full": "Object3.png",
"w": 64,
"h": 64
},
"tags": [
"Tag7",
"Tag8"
]
}
}
}
有了这个响应,我想遍历数据
中的所有对象。数据
中的对象数量并不总是相同的;可能只有一个或十个对象
我遇到的问题是,由于以下错误,我无法循环使用data
属性:
foreach语句无法对“Objects”类型的变量进行操作,因为“Objects”不包含“GetEnumerator”的公共实例或扩展定义
我知道为什么会出错,但我找不到解决问题的方法
我的代码:
MainWindow.xaml.cs
WebRequest request = WebRequest.Create(path);
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string ReaderJson = reader.ReadToEnd();
var JsonResponse = JsonConvert.DeserializeObject<Response>(ReaderJson);
foreach (var obj in JsonResponse.data)
{
Console.WriteLine(obj.ToString());
}
public class Response
{
public string version { get; set; }
public Objects data { get; set; }
}
public class Objects
{
public string id { get; set; }
public string name { get; set; }
public string title { get; set; }
public Info info { get; set; }
public Images images { get; set; }
}
public class Info
{
public int info1 { get; set; }
public int info2 { get; set; }
public int info3 { get; set; }
}
public class Images
{
public string full { get; set; }
public int w { get; set; }
public int h { get; set; }
}
如何在不使用
obj1
、obj2
等调用的情况下循环遍历data
中的所有对象?这里的问题是,您的JSON模式为数据定义了一个字典,但是数据
属性返回对象
类的单个实例
数据模型
您希望您的响应
类看起来像这样:
公共类响应
{
公共字符串版本{get;set;}
公共字典数据{get;set;}
}
其他一切都应该很好
循环浏览数据
鉴于上述情况,您现在可以使用以下方法循环查看数据
字典:
foreach(JsonResponse.data中的var obj)
{
控制台写入线(对象键);
}
注意:当在字典中循环时,将返回KeyValuePair
的枚举,其中键(即obj1
)位于key
属性中,对象位于Value
属性中
命名约定
显然,名称Objects
在这里没有意义,因为它代表单个对象,而不是对象的集合。为了与您的代码保持一致,我保留了它Objects
,但您需要给它一个单数名称。我想这是你想让它代表一个收藏而留下的。@Milkshake先生:很高兴听到这个消息!另外,如果您控制数据,另一种方法是将数据
作为JSON中的数组,然后将其映射到集合
——或者,如果您仍然希望对其进行键控,然后根据您的id
属性创建一个KeyedCollection
。是的,如果数据确实是一个数组,那么这会容易得多,但遗憾的是,JSON是来自API的响应,我无法更改它:(但是,KeyedCollection
是一个很好的选择,我会尝试一下:我猜数据不是你所想的那样。它看起来像是一个对象,而不是一个集合。你的数据模型没有映射到你的JSON数据。你的data
属性应该是一个字典。(顺便说一句,这里的类名Objects
有点奇怪;只有集合才应该命名为复数。)啊,好的,谢谢!是的,我后来想重命名Objects类,但我首先想解决这个问题。这是一个糟糕的做法,我很遗憾经常这样做。仅供参考:我将该评论形式化,作为一个更详细的回答,尽管听起来你已经从我的评论中获得了要点。让我知道这是否适用于你!