C# 使用JObject c读取动态json属性值#

C# 使用JObject c读取动态json属性值#,c#,wpf,json,json.net,C#,Wpf,Json,Json.net,我的Json结构的一部分是dynacmic数组,我想使用Json.Net读取它。 json结构是 { "objects": [{ "id": "521daea47288c7794c88c923", "name": "Rass", "email": "ras@hjsh.com", "username": "ras", "books": [], "devices": [], "preferences": [ { "name":

我的Json结构的一部分是dynacmic数组,我想使用Json.Net读取它。 json结构是

{
"objects": [{
    "id": "521daea47288c7794c88c923",
    "name": "Rass",
    "email": "ras@hjsh.com",
    "username": "ras",
    "books": [],
    "devices": [],
    "preferences": [
    {
    "name": "key1",
    "value": [
      {
        "id": "val1Id",
        "params": [
          {
            "name": "set1key",
            "value": 0
          },
          {
            "name": "set1key2",
            "value": 0
          },
          {
            "name": "set1key3",
            "value": 0.5
          }
        ]
      },
      {
        "id": "val2Id",
        "params": [
          {
            "name": "set2key",
            "value": 0
          },
          {
            "name": "set2key2",
            "value": 0
          },
          {
            "name": "set2key3",
            "value": 0.5
          }
        ]
      }
    ]
  },
  {
    "name": "language",
    "value": "en_US"
  },
  {
    "name": "page_zoom",
    "value": 1
  }
],
"created": "2013-08-28T08:02:44.000Z"
}],
"meta": {
    "total_count": 1,
    "offset": 0,
    "limit": 1000
}
}

如何访问c#代码中的首选项集。 我使用下面的代码从json获取首选项标记

   var jObject = JObject.Parse(jsonString);
        JObject obj = (JObject)jObject["objects"][0]["preferences"][0];
        string pref = "";
        foreach (var pref_item in obj)
        {
            string key = pref_item.Key;               
           //Here i want to check the Value is of type array, then get each item from Array.
            //If its not an array simply read the value
        }
现在我想导航到每个首选项,存储名称和值属性。如果值为array,则我希望访问该数组中的每个项。
我该怎么做呢?

基于有些模糊的需求,很难确切地知道您需要什么,但这里有一些代码可以为您提供首选项的
字典:

JArray preferences = (JArray)jObject["objects"][0]["preferences"];
var dictionary = preferences.ToDictionary(x => (string) x["name"],
                                          x => x["value"]);

// For example...
Console.WriteLine(dictionary["language"]); // prints en_US
然后你可以用这些代币做任何你想做的事情。值本身是数组的任何内容都将具有
JArray
值。您可以很容易地进行测试:

JToken value = dictionary[key];
JArray array = value as JArray;
if (array != null)
{
    ...
}    
或:


我希望它非常简单-看起来您已经获得了获得第一个首选项的代码(如果最后没有
[0]
,那么将是所有首选项)。那么您得到的代码出了什么问题呢?实际的json略有不同(更新的问题),所以我使用了代码,如果我尝试在没有[0]的情况下解析,它将返回错误“无法将类型为'Newtonsoft.json.Linq.JArray'的对象强制转换为类型Newtonsoft.json.Linq.JObject”。”如果我将JObject更改为JArray,它将再次返回exception不是要解析的有效JArray。首选项本身是一个
JArray
,但您可以请求该
JArray
中的任何元素。那个么,你们到底想用这些首选项做什么,你们试过哪些代码,出了什么问题?如果没有具体的需求,很难帮助您。请参阅我在讨论中使用的代码示例(现在已更新)@JMat:我给出的代码已经构建了一个名称和值字典。您需要做哪些没有实现的事情?是的,它有助于从JSON对象获取值。我在代码中做了更多的修改,这样我就可以遍历所有的子级和子级。(答案编辑)@JMat:请不要编辑别人的答案来添加大块代码。这应该是对你的问题的一个编辑,如果有的话(或者一个新的答案)——虽然说实话,它对其他读者是否有用还不清楚。我将在以后的帖子中继续这样做。感谢您帮助解决当前问题
JToken value = dictionary[key];
if (value.Type == JTokenType.Array)
{
    JArray array = (JArray) value;
    ...
}