【问题标题】:How to query multiple json nodes?如何查询多个json节点?
【发布时间】:2020-12-10 18:50:05
【问题描述】:

我有以下 json:

{
  "key445" : {
    "text" : "cat",
    "id" : 445
  },
  "key457" : {
    "text" : "mouse",
    "id" : 457
  },
  "key458" : {
    "text" : "rodent",
    "id" : 458
  }
}

我正在尝试将textid 提取到List<TextIdentifier>(带有字符串和int 的类),甚至分别提取到List<string>List<int>

我使用JObject.Parse 方法将文本读入JObject。但是,我不知道如何到达 text 和 id 节点。我尝试了以下方法,但没有返回任何内容。

var textTokens = o.SelectTokens("/*/text");
var idTokens = o.SelectTokens("/*/id");

我怎样才能得到我想要的令牌?

【问题讨论】:

  • 有什么理由解析成JObject,而不是解析成Dictionary<string, TextIdentifier>,我怀疑它会立即起作用?
  • @JonSkeet 没有理由,我只是不知道该怎么做。 JObject 似乎是调试它的好方法。
  • 对。所以如果TextIdentifier 具有TextId 的可写属性,这就是你需要做的一切:)
  • @JonSkeet 我的问题是找到正确的 JsonPath 查询以从 json 中提取这些标记。一旦我得到它们,我绝对可以将它们写入一个对象。
  • 我的意思是你根本不需要使用 JsonPath。只需将整个对象转换为Dictionary<string, TextIdentifier>,然后如果您只需要这些值,只需使用Values 属性。除非您按照 JSON 文件的顺序需要它们,否则将非常脆弱。 (现在添加示例。)

标签: c# json .net json.net


【解决方案1】:

我只是将整个 JSON 转换为 Dictionary<string, TextIdentifier>,而不是尝试使用 JsonPath:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;

public class TextIdentifier
{
    public string Text { get; set; }
    public int Id { get; set; }
    public override string ToString() => $"Id: {Id}; Text: {Text}";
}

public class Test
{
    static void Main()
    {
        var json = File.ReadAllText("test.json");
        var dictionary = JsonConvert.DeserializeObject<Dictionary<string, TextIdentifier>>(json);

        foreach (var pair in dictionary)
        {
            Console.WriteLine($"{pair.Key} => {pair.Value}");
        }
    }
}

输出:

key445 => Id: 445; Text: cat
key457 => Id: 457; Text: mouse
key458 => Id: 458; Text: rodent

如果您不关心密钥,可以使用dictionary.Values.ToList() 获得List&lt;TextIdentifier&gt;,尽管您不应该依赖它们的顺序。

【讨论】:

  • 哇,这实际上是完美的。我希望我能投票更多。
猜你喜欢
  • 2015-07-17
  • 2014-08-05
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多