簡體   English   中英

反序列化JSON對象數組,但當數組包含1個對象時,數組被省略

[英]Deserializing JSON Array of Objects, but when Array contains 1 Object, array is omitted

我正在使用 .NET Core 的 api,它返回對象數組。 但是當數組只包含一個對象時,外部API會移除數組,直接粘貼對象。

我希望有一個不需要我使用 JObjects 或覆蓋 JsonConverter 的屬性或設置。

我正在處理的示例 JSON:

{
    "a": {
        "b": [{
            "id": 1,
            "name": "first object"
        }, {
            "id": 2,
            "name": "second object"
        }]
    }
}

省略數組的 Json

{
    "a": {
        "b": {
            "id": 1,
            "name": "One object only"
        }
    }
}

這就是我正在做的(簡化)

public class Response
{
    public A a { get; set; }
}

public class A
{
    public List<B> b { get; set; }
}

public class B
{
    public int id { get; set; }
    public string name { get; set; }
}

var apiResponse = await response.Content.ReadAsAsync<Response>()

我希望當第二個 JSON 示例返回時,ReadAsAsync() 會自動理解它應該被轉換為一個包含 B 對象的數組。

問題是這可能發生在 API 響應的許多地方。

您可以創建一個自定義 JsonConverter 來檢查您是在處理數組還是單個對象。 以下示例顯示了一個轉換為List<T>的轉換器:

public class ArrayJsonConverter<T> : JsonConverter<List<T>>
{
    public override List<T> ReadJson(JsonReader reader, Type objectType, List<T> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartObject)
        {
            var jObj = JObject.Load(reader);
            var obj = jObj.ToObject<T>();
            var lst = new List<T>();
            lst.Add(obj);
            return lst;
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            var jArray = JArray.Load(reader);
            return jArray.ToObject<IEnumerable<T>>().ToList();
        }
        throw new InvalidOperationException();
    }

    public override void WriteJson(JsonWriter writer, List<T> value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

轉換器首先檢查讀取器是位於對象還是數組。 根據這一點,它要么創建一個只有一個對象的列表,要么讀取數組。
為了使用它,您可以使用JsonConverter屬性標記屬性,例如:

public class A
{
    [JsonConverter(typeof(ArrayJsonConverter<B>))]
    public List<B> b { get; set; }
}

暫無
暫無

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

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