簡體   English   中英

使用C#NewtonSoft的嵌套JSON

[英]Nested JSON using c# NewtonSoft

任何人都可以使用C#和json.net提供一些建議(可能帶有代碼段)以讀取一些嵌套json嗎? 我下面的json使用JSONLint驗證為良好的json。 我遇到一個障礙,當解析json時,我無法進入嵌套在根目錄中的第3,第4,第6和第8值。

[{
"interactionType": "MathEditorInteraction",
"interactionId": "08506178-22ba-4fa7-a490-c785716f10dc",
"value": "blah blah blah"
},
{
"interactionType": "MathEditorInteraction",
"interactionId": "1134871f-980e-4138-9598-0d4bf480aa97",
"value": "my first value"
},
{
"interactionType": "CanvasInteraction",
"interactionId": "89cd7bec-d0e8-4111-8442-f2ab95a1410b",
"value": "my second value"
},
{
"interactionType": "FillInBlankInteraction",
"interactionId": "7e9350b4-fb85-4f12-869e-227f99f77a73",
"value": "{\"results\":[{\"id\":\"1ac6770e-2093-4b7c-b595-789be8ee6efb\",\"value\":\"my third value\"}]}"
},
{
"interactionType": "FillInBlankInteraction",
"interactionId": "6f1ca6b7-3178-44a7-b8e9-e82d8c51d1fd",
"value": "{\"results\":[{\"id\":\"b7e92fd2-9c7a-4f71-88f9-e7d43e3179b7\",\"value\":\"my fourth value\"}]}"
},
{
"interactionType": "TextBoxInteraction",
"interactionId": "284c43f9-a268-4295-b96d-bc2f6dc30f0e",
"value": "my fifth value"
},
{
"interactionType": "FillInBlankInteraction",
"interactionId": "544b9907-139a-4c78-9671-502153be2697",
"value": "{\"results\":[{\"id\":\"f4e1ba6d-61dd-4eed-9c6f-dafc2701c161\",\"value\":\"my sixth value\"}]}"
},
{
"interactionType": "TextBoxInteraction",
"interactionId": "c0a5a1f0-2cae-42fd-8726-0ad36c11f413",
"value": "my seventh value"
},
{
"interactionType": "FillInBlankInteraction",
"interactionId": "ef6a7b62-8a7b-4b7f-b876-0d78ee6c4c87",
"value": "{\"results\":[{\"id\":\"af39469e-c041-4889-9e28-61a438cf56a3\",\"value\":\"my eight value\"}]}"
},
{
"interactionType": "TextBoxInteraction",
"interactionId": "f04de5b5-8a29-4200-a886-15f7dbd575b6",
"value": "my nineth value"
}]

然后我一直在使用一些C#:

JArray token = JArray.Parse(response); // response = json string above
for (int i = 0; i < token.Count; i++)
{
    String value = token[i]["value"].ToString();
}

我可能會對使用的JSON感到驚訝...它可能具有n個嵌套的值...我的代碼的目的是使用“值”字符串到達​​最底層的子級。 有沒有辦法查看令牌[i] [“某些字符串”]並查看其是否包含JArray或JObject以便繼續解析?

根據蒂莫西的建議進行編輯,我能夠輸出這些值。 快好了。

static string json2 = @"[{""interactionType"": ""MathEditorInteraction"",""interactionId"": ""08506178-22ba-4fa7-a490-c785716f10dc"",""value"": ""blah blah blah""},{""interactionType"": ""MathEditorInteraction"",""interactionId"": ""1134871f-980e-4138-9598-0d4bf480aa97"",""value"": ""my first value""},{""interactionType"": ""CanvasInteraction"",""interactionId"": ""89cd7bec-d0e8-4111-8442-f2ab95a1410b"",""value"": ""my second value""},{""interactionType"": ""FillInBlankInteraction"",""interactionId"": ""7e9350b4-fb85-4f12-869e-227f99f77a73"",""value"": ""{\""results\"":[{\""id\"":\""1ac6770e-2093-4b7c-b595-789be8ee6efb\"",\""value\"":\""my third value\""}]}""},{""interactionType"": ""FillInBlankInteraction"",""interactionId"": ""6f1ca6b7-3178-44a7-b8e9-e82d8c51d1fd"",""value"": ""{\""results\"":[{\""id\"":\""b7e92fd2-9c7a-4f71-88f9-e7d43e3179b7\"",\""value\"":\""my fourth value\""}]}""},{""interactionType"": ""TextBoxInteraction"",""interactionId"": ""284c43f9-a268-4295-b96d-bc2f6dc30f0e"",""value"": ""my fifth value""},{""interactionType"": ""FillInBlankInteraction"",""interactionId"": ""544b9907-139a-4c78-9671-502153be2697"",""value"": ""{\""results\"":[{\""id\"":\""f4e1ba6d-61dd-4eed-9c6f-dafc2701c161\"",\""value\"":\""my sixth value\""}]}""},{""interactionType"": ""TextBoxInteraction"",""interactionId"": ""c0a5a1f0-2cae-42fd-8726-0ad36c11f413"",""value"": ""my seventh value""},{""interactionType"": ""FillInBlankInteraction"",""interactionId"": ""ef6a7b62-8a7b-4b7f-b876-0d78ee6c4c87"",""value"": ""{\""results\"":[{\""id\"":\""af39469e-c041-4889-9e28-61a438cf56a3\"",\""value\"":\""my eight value\""}]}""},{""interactionType"": ""TextBoxInteraction"",""interactionId"": ""f04de5b5-8a29-4200-a886-15f7dbd575b6"",""value"": ""my ninth value""}]";

var x = JsonConvert.DeserializeObject<Interaction[]>(json2);
for (int i = 0; i < x.Length; i++)
{
if (x[i].value.Contains("[{"))
    {
        var v = JsonConvert.DeserializeObject<Nested>(x[i].value);
        Console.WriteLine(v.results[0].value);
    }
else
    {
        Console.WriteLine(x[i].value);
    }       
}

控制台輸出:

blah blah blah
my first value
my second value
my third value
my fourth value
my fifth value
my sixth value
my seventh value
my eight value
my ninth value

仍然停留在實際檢測比第一層更深的陣列上。 您可以看到我的技巧來尋找“ [{””,這不是首選。

編輯:JENS的KUDOS幫助我找到了今天需要的解決方案。 請參閱下面的評論以獲取完整說明。

如果您不希望反序列化對象,則可以對JToken.Type做出反應。 實際上,我實際上是在自己的C#中以動態方式使用JSON,從來沒有將其反序列化為強類型,這主要是因為我們使用的后端是由客戶端定義數據結構的,我們需要能夠處理更多的事情。動態數據。

https://dotnetfiddle.net/awUSGT

    dynamic arr = JArray.Parse(JSON); // response = json string above

    foreach (dynamic token in arr)
    {
        JTokenType type = ((JToken)token.value).Type;

        switch (type)
        {
            case JTokenType.String:
                Console.WriteLine(token.value);
                break;

            case JTokenType.Object:
                Console.WriteLine(token.value.results.Last.value);
                break;
        }
    }

請注意,對於8.x或9.x之前的版本(我記得發布此修復程序時不記得),在將其轉換為JToken時,上述內容會引發異常。

因此可以改為:

    dynamic arr = JArray.Parse(JSON); // response = json string above

    foreach (JObject token in arr)
    {
        dynamic value = token["value"];
        switch (token["value"].Type)
        {
            case JTokenType.String:
                Console.WriteLine(value);
                break;

            case JTokenType.Object:
                Console.WriteLine(value.results.Last.value);
                break;
        }
    }

現在,作為最后的注釋,我用來美化JSON的工具似乎剝奪了一些為您的值進行的轉義。

我不知道是否有意將JSON作為字符串(Serialized JSON)進行嵌入,如果需要,則需要找到一種方法來發現它,然后對其進行解析。

寬松/寬松的方法可能是:

    dynamic arr = JArray.Parse(JSON); // response = json string above

    foreach (dynamic token in arr)
    {
        string tokenvalue = (string) token.value;
        JToken value = Regex.IsMatch(tokenvalue, "^\\{.*\\}$") 
            ? JToken.Parse(tokenvalue) 
            : token.value;
        switch (value.Type)
        {
            case JTokenType.String:
                Console.WriteLine(value);
                break;

            case JTokenType.Object:
                Console.WriteLine(((dynamic)value).results.Last.value);
                break;
        }
    }

由於我不完全了解您的“遞歸嵌套”的外觀,因此很難猜測,但是有些類似的東西:

public static void Main()
{
    dynamic arr = JArray.Parse(JSON); // response = json string above

    foreach (dynamic token in arr)
    {
        JToken value = ExtractValue(token);
        Console.WriteLine(value);
    }
}

private static JToken ExtractValue(dynamic token)
{
    string tokenvalue = (string) token.value;
    JToken value = Regex.IsMatch(tokenvalue, "^\\{.*\\}$")
        ? JToken.Parse(tokenvalue)
        : token.value;

    switch (value.Type)
    {
        case JTokenType.String:
            return value;

        case JTokenType.Object:
            return ExtractValue(((dynamic) value).results.Last);

        default:
            throw new InvalidOperationException("Could not extract data, unknown json construct.");
    }
}

也許。

嘗試使用此方法: JsonConvert.DeserializeObject<Interaction[]>(yourJson);

Interaction在哪里:

public class Interaction
{
    public string interactionType {get;set;}
    public string interactionId {get;set;}
    public string value {get;set;}
}

然后,對於具有嵌套JSON的對象,您可以簡單地將它們的value屬性解析為以下內容:

public class Nested
{
    public Result[] results {get;set;}
}

public class Result
{
    public string id {get;set;}
    public string value {get;set;}
}

然后像這樣解析它:

var v = JsonConvert.DeserializeObject<Nested>(x[8].value);

您可以使用此服務輕松生成模型類

使用此模型,您可以使用Newtonsoft Json輕松地反序列化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM