簡體   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