我已成功在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
但是我无法通过名称从对象中提取值,例如,这不对,但基本上我想要
_members [0] [“name”]或,_members [0] .name
我认为反序列化器会在数组字典中生成对象,但我认为我正在清除丢失的东西......
答案 0 :(得分:12)
我建议您使用Json.NET来做您正在做的事情。以下代码可以满足您的需求:
JObject jObject = JObject.Parse(json);
JToken memberName = jObject["members"].First["name"];
Console.WriteLine(memberName); // Joe
通过LINQ to Json。
更新
var js = new JavaScriptSerializer();
var d = js.Deserialize<dynamic>(json);
Console.WriteLine(d["members"][0]["name"]); // Joe
也工作正常。
答案 1 :(得分:2)
你的语法非常接近。这里的关键是d["members"]
属于Object[]
/ object[]
类型。 <{1}}代替Array
,您可以使用dynamic[]
,一切正常。
另请注意,即使这个声明也没有明确的必要,如DPeden的更新样本所示。
以下是您更新的代码段的代码(我使用了一个控制台应用来测试):
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);
这是显示数组和成员访问权限的附加代码。
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();
答案 2 :(得分:1)
答案有点晚了,但我一直想弄清楚这一点,并认为我应该发布一些对我有用的地方。
我想使用foreach:
foreach (var member in json["members"])
{
Console.WriteLine(member["name"]);
}
顺便说一句,(出于某种原因,比如在我的项目中),如果你有嵌套数组,例如
string json =
{"key":"1234","status":"ok",
"members":[
{"items"[
{"id":7,"name":"Joe"},
{"id":2,"name":"Robert"},
{"id":18,"name":"Tim"}
]}
]}
然后:
foreach (var member in json["members"])
{
foreach (var item in member["items"])
{
Console.WriteLine(item["name"]);
}
}