【问题标题】:c# get all childs of a array with specified namec# 获取具有指定名称的数组的所有孩子
【发布时间】:2017-09-28 12:01:55
【问题描述】:

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

https://i.hizliresim.com/o6Z0Wb.png

{"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);
        }

【问题讨论】:

  • 请显示示例 json..
  • 我编辑了问题
  • json_array 是什么类型,你使用哪个框架进行反序列化?
  • 我使用了 Newtonsoft.json 金块
  • 只需将数据反序列化为某种 .NET 数据类型,然后使用选择查询来选择前 227 个元素:myList.Take(227).Select(x =&gt; x.data)

标签: c# arrays json serialization deserialization


【解决方案1】:

这里有一些代码:

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;}
}

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

【讨论】:

  • 对不起,我的代码是; var json = wc.DownloadString("site/JSON_DATA"); JObject data = JObject.Parse(json); var test = (string)data["result"][0-226]["NAME_TO_GET_VALUE"] textBox7.Text = test ;
【解决方案2】:

首先你必须将你的 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);

【讨论】:

  • 不,我想带 227 个具有特定名称的孩子,例如:deserialized_Json["results"][0-227]["SPECİFİED_NAME_FOR_GET_VALUES"];
【解决方案3】:

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

接下来,您可以像这样对 Json 进行去化:

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

这将为您提供一个根对象的实例,其中的数据保存在一个数组中。

编辑:

要选择值,您可以执行以下操作(在反序列化上一行中的数据之后):

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

这将给出一个列表,其中仅包含您所有整体的 name 属性中的字符串。

【讨论】:

  • 请看添加到问题的图片。
  • @Radagast - 我不清楚,数据中的所有实例都是同一类型吗?还是数组包含多种类型?也就是说,您是在寻找属性name 的所有值,还是从数组中的所有实例中寻找那些包含 属性name(以及其他不包含此类属性)。
  • 是的,所有实例都是同一类型,我正在寻找属性“名称”的所有值
猜你喜欢
  • 2016-08-30
  • 2015-08-26
  • 1970-01-01
  • 2012-04-17
  • 2013-04-03
  • 1970-01-01
  • 2018-03-20
  • 2013-04-19
  • 2012-01-29
相关资源
最近更新 更多