C# JSON 反序列化:如何从 JSON 对象数组中获取值
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9526159/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JSON Deserialization: How to get values out of a JSON array of objects
提问by brnwdrng
I've successfully deserialized this JSON string in C#, but can't extract the values from the objects nested in the array:
我已经在 C# 中成功反序列化了这个 JSON 字符串,但无法从嵌套在数组中的对象中提取值:
JavaScriptSerializer js = new JavaScriptSerializer();
string json =
{"key":"1234","status":"ok","members":
[{"id":7,"name":"Joe"},
{"id":2,"name":"Robert"},
{"id":18,"name":"Tim"}
]
}
var d = js.Deserialize < dynamic > (json);
string _key = d["key"]; // this works
Array _members = d["members"]; // this works, length = 3
But I'm having trouble extracting the values out of the objects by name, e.g, this isn't right, but essentially I want
但是我无法按名称从对象中提取值,例如,这是不对的,但基本上我想要
_members[0]["name"] or, _members[0].name
_members[0]["name"] 或,_members[0].name
I think the deserializer makes the objects inside the array dictionaries, but I think I'm clearing missing something...
我认为反序列化器在数组字典中创建对象,但我想我正在清除丢失的东西......
回答by David Peden
I recommend using Json.NETto do what you're doing. The following code does what you want:
我建议使用Json.NET来做你正在做的事情。以下代码执行您想要的操作:
JObject jObject = JObject.Parse(json);
JToken memberName = jObject["members"].First["name"];
Console.WriteLine(memberName); // Joe
Via LINQ to Json.
通过LINQ 到 Json。
Update:
更新:
var js = new JavaScriptSerializer();
var d = js.Deserialize<dynamic>(json);
Console.WriteLine(d["members"][0]["name"]); // Joe
Also works fine.
也工作正常。
回答by meklarian
You were quite close in syntax. The key here is that d["members"]is of type Object[]/ object[]. Instead of Array, you can use dynamic[]and everything works just fine.
你在语法上非常接近。这里的关键是d["members"]类型为Object[]/ object[]。而不是Array,您可以使用dynamic[]并且一切正常。
Also note that even this declaration isn't explicitly necessary, as shown in DPeden's updated sample.
另请注意,即使此声明也不是明确必需的,如 DPeden 的更新示例所示。
Here is the code for your updated snippet (I used a console app to test):
这是您更新的代码段的代码(我使用控制台应用程序进行测试):
JavaScriptSerializer js = new JavaScriptSerializer();
dynamic d = js.Deserialize<dynamic>(json);
string key = d["key"];
string status = d["status"];
dynamic[] members = d["members"];
Console.WriteLine("key = {0}", key);
Console.WriteLine("status = {0}", status);
Console.WriteLine("members.length = {0}", members.Length);
Console.WriteLine("members type name = {0}", members.GetType().Name);
Console.WriteLine("d[\"members\"] type name = {0}", d["members"].GetType().Name);
And here is additional code showing array and member access.
这是显示数组和成员访问的附加代码。
Console.WriteLine("--");
for (int i = 0; i < members.Length; i++)
{
Console.WriteLine("members[{0}][\"id\"] = {1}", i, members[i]["id"]);
Console.WriteLine("members[{0}][\"name\"] = {1}", i, members[i]["name"]);
}
Console.WriteLine("--");
Console.WriteLine("{0}", d["members"][0]["id"]);
Console.WriteLine("{0}", d["members"][0]["name"]);
Console.ReadKey();
回答by koko
It's a bit late for an answer but I've been trying to figure this out and thought I should post somewhere what worked for me.
答案有点晚了,但我一直在努力解决这个问题,并认为我应该在某个地方发布对我有用的东西。
I wanted to use foreach so:
我想使用 foreach 所以:
foreach (var member in json["members"])
{
Console.WriteLine(member["name"]);
}
and by the way, (for some reason like in my project) if you have nested arrays, e.g.
顺便说一句,(出于某种原因,例如在我的项目中),如果您有嵌套数组,例如
string json =
{"key":"1234","status":"ok",
"members":[
{"items"[
{"id":7,"name":"Joe"},
{"id":2,"name":"Robert"},
{"id":18,"name":"Tim"}
]}
]}
Then:
然后:
foreach (var member in json["members"])
{
foreach (var item in member["items"])
{
Console.WriteLine(item["name"]);
}
}

