代码之家  ›  专栏  ›  技术社区  ›  K.Z

如何签入C#JArray具有特定的密钥对

  •  0
  • K.Z  · 技术社区  · 6 年前

     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": ""
     }
    ]]}
    

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

    有时我一点也得不到这房子

    我试图以下检查,以涵盖所有的情况,但它不是真的工作。

    代码

     if (answerItems.value != null && answerItems.value.HasValues && answerItems.value["id"]!=null)
                    {
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Shawn Lehner    6 年前

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

    {
       "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 .