繁体   English   中英

如何从 JSON 对象(非数组)中获取 JSON 对象列表(非反序列化)

[英]How get List of JSON Objects from within a JSON object (non-array) (NOT Deserializing)

我在 Json.NET NuGet 中使用 C#。 我有如下所示的 JSON:

{
    "pre" : "",
    "options": {
        "0001" : {
            "id" : "0001",
            "desc" : "first"
        },
        "0002" : {
            "id" : "0002",
            "desc" : "second"
        },
        "0003" : {
            "id" : "0003",
            "desc" : "third"
        }
    },
    "post" : ""
}
  1. 如何查询上述 Json 以获取其中包含 3 个选项项的List<JObject>
  2. 或者/还有我怎样才能得到第 2 项应该是的第二项:

     { "id" : "0002", "desc" : "second" }

我试过类似的东西

var items = json.SelectTokens("options[*]").ToList();

var item = json.SelectTokens("options[1]");

但那些显然不起作用。

编辑:

如果我不清楚,我不想反序列化。 我想要一个List<JObject>

你的 json 是有效的,但你对这个 json 的想法不太准确。

您认为 options 有一个您想要迭代的对象列表,但事实并非如此。 options不是一个列表,而是一个包含更多对象的对象。不是一个数组。

您可以通过首先查找 JObject 的属性来访问 JObject 中的每个元素。 属性是 0001、0002 等。一旦你有了这些,你就可以遍历选项的属性并获得你需要的值。

    JObject options = (JObject)JObject.Parse(json)["options"];

    // Get a list of all tokens within this object.
    List<JObject> allObjects = new List<JObject>();
    foreach (var node in options.Properties())
        allObjects.Add((JObject)options[node.Name]);

    // Access the IDs
    allObjects.ForEach(x => Console.WriteLine(x["id"].ToString()));

    // Access the 2nd ID only
    Console.WriteLine(); // Just to space it out.
    Console.WriteLine(allObjects[1]["id"].ToString());

输出

0001
0002
0003

0002

您可以使用 Linq 创建所需的列表。 例如,

var list = ((JObject)JObject.Parse(str)["options"])
                            .Properties()
                            .Select(x=>x.Value)
                            .Cast<JObject>()
                            .ToList();

要访问第二个元素,您可以使用

var secondId = (string)list[1]["id"];
var secondDesc = (string)list[1]["desc"];

我实际上很接近但太努力了:

var items = json.SelectToken("options").ToList();

我无法弄清楚如何从查询中获取单个选项,但由于我得到了整个列表,我是这样做的:

var item = json.SelectToken("options").ToList()[1];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM