0

我在 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"}]但它仍然会引发相同的错误。

有任何想法吗?

4

3 回答 3

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"];
于 2013-07-08T04:32:00.643 回答
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# 环境中实现更强大、更清晰的结构。

于 2013-07-08T04:49:52.207 回答
0

JSON 是一个列表而不是字典。

所以你需要做的是:

string he_ident = (string)(((ArrayList)o2)[0])["he_ident"];

(或者简单地遍历列表)

JSON数据:

{"le_ident":"06L"}

应该使用您那里的代码。

于 2013-07-08T03:48:24.173 回答