我在c#中获取json值时遇到了一些问题。
http://i.stack.imgur.com/Uxn8e.png
以下是相关代码:
var json2 = new WebClient().DownloadString("http://fetch.json.url.here" + Input_Textbox.Text);
JObject o2 = JObject.Parse(json2);
string he_ident = (string)o2["he_ident"];
string le_ident = (string)o2["le_ident"];
Console.WriteLine(he_ident);
Console.WriteLine(le_ident);
第204行是:JObject o2 = JObject.Parse(json2);
json是这样的:[{"le_ident":"06L","he_ident":"24R"},{"le_ident":"06R","he_ident":"24L"},{"le_ident":"07L","he_ident":"25R"},{"le_ident":"07R","he_ident":"25L"}]
我也尝试过只使用一组le_ident和he_ident,例如[{"le_ident":"06L","he_ident":"24R"}]
,但它会抛出相同的错误。
有什么想法吗?
答案 0 :(得分:1)
对于json数组,你应该使用JArray而不是JObject:
var json = new WebClient().DownloadString(...);
JArray array = JArray.Parse(json);
string he_ident = (string)array[0]["he_ident"];
string le_ident = (string)array[0]["le_ident"];
答案 1 :(得分:1)
就个人而言,最简洁的方法是为您期望接受的对象签名定义一个类:
class Entity {
public he_ident { get;set; }
public le_ident { get;set; }
}
然后只需将DeserializeObject()
调入集合:
var entities = JsonConvert.DeserializeObject<List<Entity>>(json2);
您应该能够访问它,就像任何C#对象一样:
foreach(var entity in entities) {
Console.WriteLine(entity.he_ident);
Console.WriteLine(entity.le_ident);
}
如果你的JSON签名是动态的(或者有点繁琐,因为你必须为每个签名定义类),这将不起作用。
但就个人而言,我发现这种方法消除了像ArrayList
之类的东西所带来的笨拙,并在代码中引入了严格的类型,我发现它通常适用于C#环境中更强大,更清晰的结构
答案 2 :(得分:0)
JSON是一个列表而不是字典。
所以你需要做的是:
string he_ident = (string)(((ArrayList)o2)[0])["he_ident"];
(或者只是循环浏览列表)
JSON数据:
{"le_ident":"06L"}
应该使用你在那里的代码。