0

我正在开发一个读取一些 JSON 数据并进行一些统计的应用程序,但现在我遇到了一个问题。

我有一个这样的字符串:

{
"position":[
  {
     "someKey1":"someVal1",
     "someKey2":"someVal2",
  },
  {
     "someKey1":"someVal3",
     "someKey2":"someVal4",
  }
}

我想访问 someKeys 和 someValues。

我将它转换为这样的字典:

Dictionary<string, object> values = deserializeJSON(json_string);

编辑1:对不起,忘记添加反序列化JSON:

private Dictionary<string, object> deserializeJSON(string p_jsonObject)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    return serializer.Deserialize<Dictionary<string, dynamic>>(p_jsonObject);
}

现在我无法使用键“位置”访问值列表。如果我尝试打印 values["position"] 的类型,我会得到:

System.Collections.ArrayList

所以我想我可以遍历这个,但我不能。我尝试使用枚举器(在此处阅读它可以迭代对象,并且我必须将其添加到 ArrayList 以进行转换):

ArrayList arr = new ArrayList();
IEnumerable enumerable = values["position"] as IEnumerable;

foreach (object element in enumerable)
{
    arr.Add(element);
}

当我打印 arr[0] 我得到:

System.Collections.Generic.Dictionary`2[System.String,System.Object]

在这里我很困惑。我认为这是 someKeys 和 someVals 的列表,应该是正确的,对吧?现在我尝试访问这些值,但没有成功。我尝试了 arr[0]["someKey1"] 但得到一个错误,我无法将索引应用于“对象”。

关于解决方案的任何想法?理想情况下是更优雅的解决方案?:)

提前致谢

4

2 回答 2

3

您可以使用Linq to JSON(从 NuGet 添加 Newtonsoft 的 JSON.NET):

JObject jo = JObject.Parse(json);
var value = (string)jo["position"][1]["someKey1"]; // someVal3

另一个样本:

JObject jo = JObject.Parse(json);
JArray positions = (JArray)jo["position"];
foreach (var item in positions)
{
    // use (string)item["someKey1"]
    // use (string)item["someKey2"]
}
于 2013-01-28T20:33:06.283 回答
2

您可以按如下方式访问元素:

LinqPad 演示

var enumerable = (IEnumerable)values["position"]; // Will get you the enumerable ArrayList
(Dictionary<string,object>)values["position"][0]; // Will get you the First element of the ArrayList
(string)values["position"][0]["someKey1"]; // Will get you someKey1 from the first position of position
于 2013-01-28T21:05:32.327 回答