簡體   English   中英

C#反序列化未標記的JSON數組

[英]c# Deserialize unlabelled JSON array

我試圖反序列化具有特定結構的JSON片段,如下所示:

{  
    "label1": "value1",  
    "label2": [  
        [  
            [  
                "concept_id_1",  
                "concept_1"  
            ],  
            score_1  
        ],  
        [  
            [  
                "concept_id_2",  
                "concept_2"  
            ],  
            score_2  
        ],  
        ……  
    ],  
    "label3": "value3",  
    "label4": "value4"  
}  

就其價值而言,分數是浮點數,其他所有東西都是字符串。 在“ label2”下返回的概念的數量是可變的。

我正在嘗試使用JSON.net反序列化它。 我真正關心的唯一內容是標記為“ label2”的數組的內部嵌套,但是數組內部缺少標簽使我無處不在。

我嘗試了多種方法,但到目前為止最成功的方法似乎是:

public class Parsed_JSON {
    public string label1 { get; set; }
    public ICollection<Full_Result> label2 { get; set; }
    public string label3 { get; set; }
    public string label4 { get; set; }
}

public class Full_Result {
    public IList<string> values { get; set; }
    public float score { get; set; }
}

Parsed_JSON result = JsonConvert.DeserializeObject<Parsed_JSON>(JSON);

但是,此操作失敗並顯示以下錯誤:

無法將當前JSON數組(例如[1,2,3])反序列化為類型'JSON_Parsing + Full_Result',因為該類型需要JSON對象(例如{“ name”:“ value”})才能正確反序列化。
要解決此錯誤,可以將JSON更改為JSON對象(例如{“ name”:“ value”}),也可以將反序列化類型更改為數組,或者將實現集合接口的類型(例如ICollection,IList)更改為List,例如List從JSON數組反序列化。 還可以將JsonArrayAttribute添加到類型中,以強制其從JSON數組反序列化。

最終,我將尋求遍歷label2的內容,以便可以像這樣構建其中的DataTable:

concept_id_1   concept_1   score_1  
concept_id_2   concept_2   score_2

如何反序列化此JSON?

您可以從此答案使用自定義JsonConverter ObjectToArrayConverter<Full_Result>C#JSON.NET-反序列化響應,該響應使用異常的數據結構將JSON反序列化為現有的類型化數據模型。 修改Full_Result如下:

[JsonConverter(typeof(ObjectToArrayConverter<Full_Result>))]
public class Full_Result 
{
    [JsonProperty(Order = 1)]
    public IList<string> values { get; set; }
    [JsonProperty(Order = 2)]
    public float score { get; set; }
}

現在,您可以按以下方式反序列化:

Parsed_JSON result = JsonConvert.DeserializeObject<Parsed_JSON>(JSON);

筆記:

  • ObjectToArrayConverter<T>通過將T可序列化成員映射到一個數組來工作,該數組序列由應用於每個成員的JsonPropertyAttribute.Order屬性的值定義。 如果願意,可以使用設置了DataMemberAttribute.Order 數據協定屬性

  • 在您的JSON中,“得分”值實際上不是數字:

     score_1 score_2 

    我假設這是問題中的錯別字,並且這些值實際上是JSON標准定義的格式正確的數字。

樣品在這里擺弄。

暫無
暫無

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

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