c#解析json:读取json对象时出错

时间:2013-07-08 03:44:33

标签: c# json json.net

我在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"}],但它会抛出相同的错误。

有什么想法吗?

3 个答案:

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

应该使用你在那里的代码。