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