从C#查询JSON

时间:2016-03-31 17:48:18

标签: c# json linq

我试图从json字符串中检索一个json项,例如这是我的json:

echos

我使用的是json.net库,这是我迄今为止尝试过的:

{   
"users":{  
  "john":{  
     "password":"0506777031",
     "level":1
  },
  "doe":{  
     "password":"john",
     "level":1
  },
  "dasda":{  
     "password":"das",
     "level":"1"
  },
  "zuri":{  
     "password":"zuri123",
     "level":2
  }
 }
}

我在第二行收到错误。    这是错误:

  

无法将Newtonsoft.Json.Linq.JProperty转换为Newtonsoft.Json.Linq.JToken。

我不确定我做错了什么,我将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:3)

假设你的问题是"我做错了什么?",答案是

  1. 您正在尝试将什么是JProperty转换为JObject(JProperty有一个名为 Value 的属性,您可以访问)。
  2. 您没有正确遍历JSON语法树。
  3. 没有提及"用户名"在提供的JSON示例中。
  4. 如果示例中的用户名是属性键(名称)" john"," doe"," dasda"和" zuri" ...您可能想要的查询如下:

    var match = json["users"].Values<JProperty>().Where(m => m.Name == "doe" && m.Value["password"].ToString() == "john").FirstOrDefault();
    

    编辑:或者,如果用户名是该密钥,则只有在密码与您要比较的密码匹配时,才可以使用直接查找并分配给变量匹配。此外,以下版本将返回JObject而不是JProperty,因为它似乎是您最初想要的。这也应该更有效率。

    JObject match;
    var temp = json["users"]["doe"];
    if(temp["password"].ToString() == "john")
    {
        match = temp.ToObject<JObject>();
    }
    

答案 1 :(得分:0)

不应该使用方括号用于&#34;用户&#34;?

{   
    "users":[  
        "john":{  
        "password":"0506777031",
        "level":1
        },
        "doe":{  
        "password":"john",
        "level":1
        },
        "dasda":{  
        "password":"das",
        "level":"1"
        },
        "zuri":{  
        "password":"zuri123",
        "level":2
        }
    ]
}