我使用.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"]
提前致谢,最诚挚的问候,克里斯蒂安。
答案 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");