从Dictionary <string,object> </string,object>中获取数据

时间:2014-07-05 08:17:40

标签: c# json object dictionary

我使用.NET通过3.5 System.Web.Extensions程序集中的System.Web.Script.Serialization.JavaScriptSerializer类型将JSON字符串转换为Dictionary。

我将JSON数据保存在字典对象中,如下所示:

        // Simple POST request
        using (System.Net.WebClient wb = new System.Net.WebClient())
        {
            // Random user data API - http://randomuser.me/
            string url = "http://api.randomuser.me/";

            var data = new System.Collections.Specialized.NameValueCollection();
            var responseStringJson = Encoding.Default.GetString(wb.UploadValues(url, "POST", data));

            var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            Dictionary<string, object> Results = jsSerializer.Deserialize<dynamic>(responseStringJson);
        }

JSON数据示例

{
  results: [{
    user: {
      gender: "male",
      name: {
        title: "mr",
        first: "patrick",
        last: "coleman"
      },
      location: {
        city: "stockton",
        state: "minnesota",
        zip: "10532"
      },
      email: "patrick.coleman45@example.com",
      username: "ticklishostrich48",
      password: "darkknight55",
      salt: ">DyBf9aih",
      md5: "5d6bf4508070fba41e2d602c847cdbd9",
      sha1: "19e5b0b59e6c86dbf370c431a7edb2aa4f1420a6",
      sha256: "9434e04d307839d9b6411254007072412c11f7e6b5d8fd848e56fe5f0c660a04"
    },
    version: "0.4"
  }]
}

如何按键值访问数据? 我会做类似的事情:

Results["results"]["version"]
Results["results"]["user"]["name"]["first"]

提前致谢,最诚挚的问候,克里斯蒂安。

3 个答案:

答案 0 :(得分:2)

如果您稍微修改一下,原始方法将起作用:

// Simple POST request
using (System.Net.WebClient wb = new System.Net.WebClient())
{
    // Random user data API - http://randomuser.me/
    string url = "http://api.randomuser.me/";

    var data = new System.Collections.Specialized.NameValueCollection();
    var responseStringJson = Encoding.Default.GetString(wb.UploadValues(url, "POST", data));

    var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    var results = jsSerializer.Deserialize<dynamic>(responseStringJson);

    // Note that the following works, because Console.WriteLine
    // automatically formats those objects to a string. If you want
    // to use these anywhere else, you will have to cast/convert the
    // values every time you access them.
    Console.WriteLine(results["results"][0]["version"]);
    Console.WriteLine(results["results"][0]["user"]["name"]["first"]);
    Console.ReadLine();
}
但是,我会建议你创建一些强类型的类,然后在项目中使用它们。例如,如果您将API网址放入http://json2csharp.com/并将这些类添加到项目中,那么读取数据的代码会有所不同:

// Simple POST request
using (System.Net.WebClient wb = new System.Net.WebClient())
{
    // Random user data API - http://randomuser.me/
    string url = "http://api.randomuser.me/";

    var data = new System.Collections.Specialized.NameValueCollection();
    var responseStringJson = Encoding.Default.GetString(wb.UploadValues(url, "POST", data));

    var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    var results = jsSerializer.Deserialize<RootObject>(responseStringJson);

    Console.WriteLine(results.results[0].version);
    Console.WriteLine(results.results[0].user.name.first);
    Console.ReadLine();
}

最大的好处是您可以向代理类添加类型转换,而无需在每次从字典访问值时都这样做,并且您可以获得对象的完整IDE和编译器支持。属性(少写错字):

答案 1 :(得分:0)

如果每个键的值也是字典,那么必须在声明中指定。不确定你使用的解串器是否支持它,但试一试。

Dictionary<string, Dictionary<string, object>>

我不建议尝试立即检索完整对象,这可能适用于单个嵌套字典,但可能存在复杂性限制。最好迭代字典中的每个KeyValuePair,如果值是字典类型,那么强制转换就是这样并单独处理它。这样,反序列化器不必假定所有值都是按定义的字典。

答案 2 :(得分:0)

  

如何按键值访问数据?我会做一些事情:
  Results["results"]["user"]["name"]["first"]

这种语法在C#中是不可能的,因为变量是强类型的。 实际上,正如hangy所解释的那样, 可以使用.net 4.0中的新动态关键字,您已经在问题中使用过了。 根据{{​​3}},您需要做的就是使用this related answer反序列化您的Json对象,它将返回一个dynamic对象,您应该可以像这样访问:{{ 1}}


如果不使用net 4.0动态强制转换,您还可以编写如下函数:

Results.results.user.name.first

您可以将此方法编写为词典的System.Web.Helpers.Json.Decode()

 Results.GetValue("results","user","name","first");