[英]Deserializing a JSON string to a C# class where JSON class may accept either array / object based on a JSON property
我必須將 JSON 字符串反序列化為 C# 類才能綁定到網格。 我已經在 C# 中實現了相應的類。 但在特定情況下,這會失敗,因為 JSON 屬性將是一個數組或 object。 請檢查字符串的一部分。
我創建了 ItemList class 和 3 個屬性 IL1、Name 和另一個 object class “項目”。 但是,您可以看到,當屬性“名稱”為橡膠時,我應該將項目列表 class 作為屬性,而不是項目 object。 當它是橡膠時,它返回 2 個項目的數組。
"ItemList": [
{
"@IL1": "Yes",
"@Name": "Pencil"
"Item": {
"@ItemType": "Pencil",
"@Item2": "1A7716744F7048ACA2549BE93F0A2BF1",
"aimLink": {
"@id": "1A7716744F7048ACA2549BE93F0A2BF1",
"@DisplayText": "P00001"
}
}
},
{
"@IL1": "Yes",
"@Name": "Pen",
"Item": {
"@ItemType": "Pen",
"@Item2": "AE067F7EDB6147C09AED243C1F7FAD25",
"aimLink": {
"@id": "AE067F7EDB6147C09AED243C1F7FAD25",
"@DisplayText": "5100010654120001
}
}
},
{
"@IL1": "Yes",
"@Name": "Rubber",
"Item": [
{
"@ItemType": "Rubber",
"@ItemGID": "622025629037499394DF092DA16BAB7F",
"aimLink": {
"@id": "622025629037499394DF092DA16BAB7F",
"@DisplayText": "12345678-1234-123456-7116#01"
}
},
{
"@ItemType": "Rubber",
"@ItemGID": "F336F65F8E014E80B84A2312F829493C"
"aimLink": {
"@id": "F336F65F8E014E80B84A2312F829493C",
"@DisplayText": "12345678-1234-123456-7116#14"
}
}
]
}
],
如何有效地將其解析為 C# class 以及完成此操作的最簡單方法?
謝謝, 迪維亞
您可以通過制作自定義JsonConverter
來解決此問題,您可以使用下面將單個值轉換為數組,然后使用JsonConverter
屬性標記Item
屬性
public class SingleValueArrayConverter<T> : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
object retVal = new Object();
if (reader.TokenType == JsonToken.StartObject)
{
T instance = (T)serializer.Deserialize(reader, typeof(T));
retVal = new List<T>() { instance };
}
else if (reader.TokenType == JsonToken.StartArray)
{
retVal = serializer.Deserialize(reader, objectType);
}
return retVal;
}
public override bool CanConvert(Type objectType)
{
return false;
}
}
讓我們假設這是您的ItemList
class
public class ItemList
{
public string @IL1 { get; set; }
public string @Name { get; set; }
[JsonConverter(typeof(SingleValueArrayConverter<Item>))]
public List<Item> Item { get; set; }
}
public class Item
{
public string @ItemType { get; set; }
public string @Item2 { get; set; }
public AimLink aimLink { get; set; }
}
public class AimLink
{
public string @id { get; set; }
public string @DisplayText { get; set; }
}
您可以制作自定義JsonConverter
(例如ItemConverter
)並使用[JsonConverter(typeof(ItemConverter))]
屬性標記Item
屬性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.