[英]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.