c#获取指定名称的数组的所有子节点

问题描述:

我的问题很明确。我想在这个json数组中获得指定的项目(只有名称'name'的值);c#获取指定名称的数组的所有子节点

https://i.hizliresim.com/o6Z0Wb.png <示例('result'部分应该在前一个圆圈中。

{"success":true,"message":"","result":[ 
{"name":"VALUE_I_WANT_TO_GET1","Created":"2017-06-06T01:22:35.727"}, 
{"name":"VALUE_I_WANT_TO_GET2","Created":"2017-06-06T01:22:35.727"}, 
{"name":"VALUE_I_WANT_TO_GET3","Created":"2017-06-06T01:22:35.727"}, 
{"name":"VALUE_I_WANT_TO_GET4","Created":"2017-06-06T01:22:35.727"} 
]} 

正如你可以看到... ...这是一个清晰的问题。我的代码是(我认为它应该是这样的);

 var json = wc.DownloadString("website/url"); 
     JObject data = JObject.Parse(json); 
     var test = (string)data["result"][/*I want to get all values with name 'name'*/]["name"]; 

我用这个代码做了它,你可以用它:)

 JObject data = JObject.Parse(json); 

     for (int i = 0; i <= data["result"].Count()-1; i++) 
     { 
      var test = (string)data["result"][i]["name"]; 
      listBox1.Items.Add(test); 
     } 
+1

请显示示例json .. –

+0

我编辑的问题 – Radagast

+0

什么类型的'json_array'和您使用哪个框架进行反序列化? –

下面是一些代码:结果

void Main() 
{ 
    // create array 
    DataFromJSON[] data = new UserQuery.DataFromJSON[3]; 
    data[0] = new DataFromJSON() { Data = "val0", Created = DateTime.Now }; 
    data[1] = new DataFromJSON() { Data = "val1", Created = DateTime.Now }; 
    data[2] = new DataFromJSON() { Data = "val2", Created = DateTime.Now }; 

    var values = from x in data 
       select x.Data; 

    values.Dump(); 

} 

// Define other methods and classes here 
public class DataFromJSON 
{ 
    public string Data { get; set; } 
    public DateTime Created { get; set;} 
} 

这里#SA的图片,使用LinqPad 。行values.Dump()调用由LinqPad定义的扩展方法,将其附加到的对象输出到代码窗口下的“结果”窗口。

LinqPad5 resuts

+0

对不起,但我的代码是; var json = wc.DownloadString(“https:// site/JSON_DATA”); JObject data = JObject.Parse(json); var test =(string)data [“result”] [0-226] [“NAME_TO_GET_VALUE”] textBox7.Text = test; – Radagast

首先你要反序列化的JSON转换成你喜欢的类型:

MyType results = JsonConvert.DeserializeObject<MyType>(json_array); 

其中MyType是这样的:

class MyType 
{ 
    public bool success { get; set; } 
    public string message { get; set; } 
    public List<AnotherType> results { get; set; } 
} 

class AnotherType 
{ 
    public string data { get; set; } 
    public DateTime Created { get; set; } 
} 

现在从它那里得到的第一个227元并选择其data

var data = myInstance.results.Take(227).Select(x => x.data); 
+0

不,我想要227个孩子以一个特定的名字:deserialized_Json [“results”] [0-227] [“SPECİFİED_NAME_FOR_GET_VALUES”]; – Radagast

有一个巧妙的方法Visual Studio可以为你做。首先,复制您期望查询的json样本,打开一个新的C#文件,然后选择Edit - >Paste Special - >Paste JSON as classes
BOOM!这里是你需要的类,你应该给他们有意义的名字。

接下来,你可以desiralize JSON的,像这样:

var myInstance = JsonConvert.DeserializeJson<MyClass>(jsonString); 

这会给你的根对象的实例,以保存在里面的阵列中的数据。

编辑:

要选择的值,你可以做这样的事情(你在该行反序列化上面的数据后):

myInstance.Array.Select(x => x.name).ToList(); 

这将使仅包含字符串列表所有你的名字的属性。

+0

请看看添加到问题的图片。 – Radagast

+0

@Radagast - 有些东西对我来说不太清楚,是同一类型数据中的所有实例吗?或者数组包含多种类型?也就是说,你是在寻找属性'name'的所有值,还是从数组中的所有实例中寻找那些*包含*属性'name'(而另一个不包含这样的属性) 。 – CKII

+0

请阅读此答案请:https://stackoverflow.com/questions/46468642/c-sharp-get-all-childs-of-a-array-with-specified-name/46469888#46469888 – Radagast