【问题标题】:How to check In C# JArray have specific key pair如何在 C# JArray 中检查是否有特定的密钥对
【发布时间】:2018-11-22 00:02:25
【问题描述】:

我正在使用 .NET CORE 中的 JArray,我得到了这个特定键的随机结构,因此得到了不同的错误。我需要知道 JArray 是否有特定的子数组以及子 JArray 是否有特定的密钥对(NOT VALUE),即 value{ "Id":""} 以下错误之一;

 Accessed JArray values with invalid key value: "id". Int32 array index expected.
  at Newtonsoft.Json.Linq.JArray.get_Item(Object key) at 

我期望的标准结构如下;

{[value, [
{
  "id": "7ef82869-e235-69a2-f81e-3a9664e89bc4",
  "value": ""
 }
]]}

有时我得到 as,意思是在我尝试映射 Id 的地方抛出 null 错误。

 {[value, [
  {
   "value": ""
  }
 ]]}

有些时候我根本没有得到这个属性

我正在尝试以下检查以涵盖所有情况,但它并没有真正起作用。

代码

 if (answerItems.value != null && answerItems.value.HasValues && answerItems.value["id"]!=null)
                {

【问题讨论】:

  • 您显示的“标准结构”不是有效的JSON,因此我们很难给您具体的答案。但看起来您正在尝试将 "id" 作为数组本身的属性访问,而不是内部特定项目的属性。您可以使用 LINQ 查询数组中的对象,也可以使用 SelectToken 方法获取与您在字符串中定义的条件匹配的项目(例如answerItems.value.SelectToken("[?(@.id == '')]"))。

标签: c# json .net-core json.net


【解决方案1】:

我收到了一些关于我的简短回答的建设性批评,所以我想我会详细说明以帮助您解决问题。

首先,让我们看一下您的 JSON。简而言之,它是无效的。事实上,它甚至不接近有效的 JSON。我只能假设你的意思是这样的:

{
   "values" : [{ "id" : "7ef82869-e235-69a2-f81e-3a9664e89bc4", "value": "" }]
}

我建议您在尝试解析这样的数据并遇到问题时,您可以通过验证数据本身来解决问题。我喜欢为此使用JSONLint

接下来,从您的示例代码中很难准确地说明您要做什么。我只能猜测您正在尝试使用 dynamic 对象方法来解析和处理数据。这种方法的一个缺点是在使用数据之前很难对其进行验证。

相反,我会使用Newtonsoft.Json.Linq.JObject.Parse 方法。这为您提供了一些用于处理和验证信息的工具。下面我提供了一个非常简单的例子来说明如何做到这一点。

using System;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        string json = "{ \"values\": [{ \"id\": \"7ef82869-e235-69a2-f81e-3a9664e89bc4\",   \"value\": \"\" }] }";
        JObject obj = JObject.Parse(json);

        // Check to see if we got our value array
        if (obj.ContainsKey("values")) {
            JArray values = (JArray)obj["values"];

            // Do we have any values in our array?
            if (values.Count > 0) {
                JObject firstItem = (JObject)values[0];

                // We check to see if we have an ID parameter
                if (firstItem.ContainsKey("id")) {
                    Console.WriteLine(firstItem["id"]);
                }
            }
        }
    }
}

正如我在原始帖子中提到的,我强烈建议您查看Newtonsoft.Json documentation

【讨论】:

  • 这应该是评论,而不是答案。
  • 好收获。我继续详细说明以获得更好的答案。感谢您的批评!
  • ,非常感谢肖恩,我试试从你那里学到的东西。 Json 数据结构由某人完成,我无法更改结构,所以我必须使用我所拥有的
  • 如果您无法更改 JSON,那么您将无法使用 JSON 库来解析它。它不是 JSON。您最好使用自定义解析器自己解析它。
  • 这有很大改进。干得好。
猜你喜欢
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
相关资源
最近更新 更多