从更改数组中获取Json元素

hujrc8aj  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(107)

好了,我有了下面的json响应,它包含了一个细节数组。

{
 "top":{
   "middle":[
     {
         "name": "name1".
         "values":[
            {
                "value": 123
            }
         ]
     },
     {
         "name": "name2".
         "values":[
            {
                "value": 456
            }
         ]
     }
   ]
  }
}

我可以使用以下方法获取数据:

JObject data = JObject.Parse(JSONDATA);
var Name1 = (string)data["top"]["middle"][0]["name"];
var Value1 = (float)data["top"]["middle"][0]["values"][0]["value"];

但是,数组中的项目出现的顺序是随机的,所以我不能使用[0]和[1]来指定第一个或第二个项目。
我知道我仍然可以使用这个方法,然后计算出name1或name2是否匹配,这意味着我将知道每个名称对应的值。但它似乎非常冗长,我知道一定有一个更简单的方法。
我已经尝试了一些事情,比如

JToken mydata = data.SelectToken("$.top.middle[?(@.name == 'name1')]");

我试着根据name值得到数组的索引。
但是我就是做不好。任何帮助都将不胜感激。

h79rfbju

h79rfbju1#

我宁愿用Linq

var jObj = JObject.Parse(json);

    int value = GetValueByName("name1", jObj) // 123

public int GetValueByName(string name, JObject jObj)
{
   return jObj["top"]["middle"]
         .Where(x => (string)x["name"] == name)
         .Select(x => (int)x["values"][0]["value"])
         .FirstOrDefault();
}
5lwkijsr

5lwkijsr2#

要获取与特定名称对应的值,可以循环遍历数组并检查每个对象的name属性,直到找到要查找的对象。

JObject data = JObject.Parse(JSONDATA);
string nameToFind = "name1";
float value = -1;

JArray middleArray = (JArray)data["top"]["middle"];
foreach (JObject obj in middleArray)
{
    string name = (string)obj["name"];
    if (name == nameToFind)
    {
        value = (float)obj["values"][0]["value"];
        break;
    }
}

if (value != -1)
{
    Console.WriteLine($"The value for {nameToFind} is {value}");
}
else
{
    Console.WriteLine($"No object with name {nameToFind} was found.");
}

这个实现使用一个循环来遍历中间数组中的每个对象,并检查name属性是否与我们要查找的匹配。如果匹配,它将检索value属性并退出循环。如果没有找到匹配的对象,它将输出一条消息,指示没有找到对象。
请注意,此实现假定中间数组中只有一个具有指定名称的对象。如果可能有多个具有相同名称的对象,则可能需要修改实现以处理这种情况。

相关问题