JSON反序列化:如何从JSON对象数组中获取值

5
我已经在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

我认为反序列化程序使数组内部的对象成为字典,但我认为我漏掉了某些东西...


请查看以下链接:http://stackoverflow.com/questions/7482822/json-in-net-c-csharp-getting-values-out-of-the-object,http://www.json.org/ - MethodMan
KeyValuePair 迭代看起来很有前途,但我无法进入 {} 对象以使用它。 - brnwdrng
3个回答

18

我建议使用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

也能正常工作。


我遇到了类似的问题。你的答案帮了我很多。谢谢。 - Amir Dora.

4

可能有点晚了,但我一直在试图解决这个问题,所以认为应该在某个地方发布我的解决方法。

我想使用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"]);
        }
    }

2
你的语法非常接近正确。关键在于 d["members"]Object[] / object[] 类型。你可以使用 dynamic[] 代替 Array,这样一切都能正常工作。
另外请注意,就像 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();

你如何获取 members[i]["name"] 的字符串值? - DROP TABLE users
1
如果有可能“name”为空,则需执行以下代码:object o = d["members"][i]["name"];string name = null == o ? null : (string)o;。否则,可以用(string)(d["members"][i]["name"])来进行操作。 - meklarian
1
谢谢,我最终成功使用了Convert.ToString(bla)。感谢您的回复! - DROP TABLE users

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