代码之家  ›  专栏  ›  技术社区  ›  Felipe Oriani

如何在newtonsoft中获取此json路径。json C#

  •  1
  • Felipe Oriani  · 技术社区  · 7 年前

    我一直在构建一个应用程序,其中JSON将由用户API提供。它应该使用JSONPath从JSON读取数据,并保存所选部分。我正在尝试使用 Json.Net (Newtonsoft)。以下JSON是一个示例:

    {
      // other properties here and different structure here
    
      "Data": [
        {
          "Code": "625087",
          "Name": "Customer Name",
          "Email": "test@hfgidfgd.com"
        },
        {
          "Code": "625087",
          "Name": "Customer Name",
          "Email": "test@hfgidfgd.com"
        },
        {
          "Code": "625087",
          "Name": "Customer Name",
          "Email": "test@hfgidfgd.com"
        }
      ],
    
      // other properties here and different structure here
    }
    

    我想提取 Data 属性内容,并将其转换为 List<Dictionary<string, object>> 在我的应用程序中进行操作。

    在工具中,如 jsonpath.com 以下JSONPath查询可以正常工作,但对于Newtonsoft则不行:

    // get that json
    string content = GetJson();
    
    var jo = JObject.Parse(content);
    
    var jsonPath = "$..Data.*";
    var jsonPathResult = jo.SelectTokens(jsonPath, true /* to get error when it is not found */ );
    

    相反,我得到了一个例外:

    属性“*”在JArray上无效。

    如果我这样做JSONPath:

    var jsonPath = "$..Data"; // same for just: "Data"
    var jsonPathResult = jo.SelectTokens(jsonPath);
    

    我必须使用两个嵌套的foreach循环结果,我认为这不是一个优雅的解决方案:

    var result = new List<Dictionary<string, object>>();
    
    foreach (var jsonResult in jsonPathResult)
    {
        foreach (var item in jsonResult)
        {
            var fields = JsonConvert.DeserializeObject<Dictionary<string, object>>(item.ToString());
    
            // some adjusts on the fields dictionary will be applied here...
    
            result.Add(fields);
        }
    }
    

    是否有任何方法可以获得只进行单个循环的结果 数据 所有物

    1 回复  |  直到 7 年前
        1
  •  2
  •   dbc    7 年前

    如所示 JSONPath - XPath for JSON ,数组元素通配符的语法为 [*] . 因此,您的代码应该如下所示:

    var jsonPath = "$..Data[*]";
    var result = jo.SelectTokens(jsonPath, true /* to get error when it is not found */ )
        .Select(o => o.ToObject<Dictionary<string, object>>())
        .ToList();
    

    我在这里使用 JToken.ToObject<T>() 将每个数组元素直接反序列化为 Dictionary<string, object>> 无需重新序列化为字符串。

    样品加工 .Net fiddle .