2013-07-26 64 views
-2

我的JSON:查询的JSON数组/ JObject

"CustomData": [ 
    { 
    "Key": "RegistrationWrx", 
    "Value": "Wrx45687", 
    "Id": 462, 
    }, 
    { 
    "Key": "IsConsentGiven", 
    "Value": "True", 
    "Id": 463, 
    }, 

我使用它来获取一些值:

string fetchResult = JsonConvert.SerializeObject(sidebar, Formatting.Indented); 
JObject rss = JObject.Parse(fetchResult); 

ConsentGiven = rss["RegistrationCase"]["CustomData"][1]["Value"].Value<string>(), 

但我要检查的 “钥匙” 例如在“CustomData”上并显示“Value”。我想我需要做类似的事情:

ConsentGiven = rss["RegistrationCase"]["CustomData"].Where(["Key"]=="IsConstantGiven")["Value"].Value<string>(), 

回答

2

你的问题得到了一些标记,因为它有点含糊。

不过,我想我明白你需要什么...

我觉得最简单的解析JSON内容的方法是先将其转换。

所以创建和类,您传入的JSON匹配:

public class CustomData{ 
    public string Key {get;set;} 
    public string Value {get;set} 
    public int? ID {get;set;} 
} 

然后,在你用它来阅读JSON,实例化和类型的对象转换它曾经方法。

public CustomData ConvertCustomDataJson(string jsonString) 
{ 
List<CustomData> customData = JsonConvert.DeserializeObject<List<CustomData>>(jsonString); 
} 

然后你可以使用你的对象来轻松地循环它们,存储它们随意使用它们。

我已经很快地把这件事发了出来,所以它可能不完美。

LINQ查询找到该值

bool value = Convert.ToBool(customData.FirstOrDefault(x=> x.Key == "IsConsentGiven").Value); 

此外,你需要NewtonSoft JSON库的参考。这是一个NuGet包在VS 2012

马丁

编辑:这里是我的意思,你可以找到使用索引的不同条目完全工作版本,不过,这可能只是我,我因为我永远不知道json的内容是否会发生变化,所以我会紧张。

序列化对象给出了它意味着它应该能够应对大多数的变化json或其他数据,加上强类型的好处只是使它更容易阅读。

using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace LinqFun 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Set Data 
      string jsonString = @"[ 
             { 
             ""Key"": ""RegistrationWrx"", 
             ""Value"": ""Wrx45687"", 
             ""Id"": 462, 
             }, 
             { 
             ""Key"": ""IsConsentGiven"", 
             ""Value"": ""True"", 
             ""Id"": 463, 
             } 
            ]"; 

      //Create a list of CustomData entries to look through. 
      List<CustomData> customData = JsonConvert.DeserializeObject<List<CustomData>>(jsonString); 


      //Create an object for the is consent given block of data 

      CustomData IsConsentGiven = customData.FirstOrDefault(x => x.Key == "IsConsentGiven"); 

      //check the linq query resulted in an object 
      if (IsConsentGiven != null) 
      { 
       Console.WriteLine(IsConsentGiven.Value); 
      } 

      Console.ReadLine(); 
     } 
    } 

    public class CustomData{ 
     public string Key { get; set; } 
     public string Value { get; set; } 
     public int? ID { get; set; } 
    } 
} 

你可以拉IsConsentGiven值直出,但如果你必须包括它在情况下,try块中的数据缺失,我更喜欢检查它自己。 的LINQ直接拉出来,虽然是:

bool value = Convert.ToBoolean(customData.FirstOrDefault(x => x.Key == "IsConsentGiven").Value); 
+0

的事情是一个类linq查询。不知道是否有可能,但是像这样:ConsentGiven = rss [“RegistrationCase”] [“CustomData”]。Where([“Key”] ==“IsConstantGiven”)[“Value”]。 – stianboe

0

希望这会有所帮助,创建有那么value属性做我一直在寻找波纹管

public class Category 
{ 

    public string Value{ get; set; } 

} 

var categories = JsonConvert.DeserializeObject<List<Category>>(json)