【发布时间】:2021-05-03 20:20:25
【问题描述】:
我正在开发一个 C# 项目,我需要调用 API 并解析 JSON 响应。
JSON 响应:
{
"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 中的所有对象。 data 中的对象数量并不总是相同的。可能只有一个对象或十个对象。
我遇到的问题是我无法循环通过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());
}
JsonParser.cs
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 数据。您的
data属性应该是Dictionary<string, Objects>。 (顺便说一句,类名Objects在这里有点奇怪;只有集合应该被命名为复数形式。) -
啊,好的,谢谢!是的,我想在之后重命名 Objects 类,但我首先想解决这个问题。只是一种糟糕的做法,可悲的是,我经常这样做。
-
仅供参考:我将该评论正式化为更详细的答案 - 尽管听起来您已经从我的评论中得到了要点。让我知道这是否适合你!
标签: c# json json.net json-deserialization