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

时间:2012-03-02 00:05:03

标签: c# json

我已成功在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

我认为反序列化器会在数组字典中生成对象,但我认为我正在清除丢失的东西......

3 个答案:

答案 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"]);
        }
    }