鑒于以下結構:
"meta": {
"pagination": {
"total": 378,
"count": 50,
"per_page": 50,
"current_page": 2,
"total_pages": 8,
"links": {
"previous": "https://myapi.com.br/api/clients?page=1",
"next": "https://myapi.com.br/api/clients?page=3"
}
}
有時,屬性“links”的值作為空陣列回傳。
"meta": {
"pagination": {
"total": 14,
"count": 14,
"per_page": 50,
"current_page": 1,
"total_pages": 1,
"links": []
}
}
所以我創建了一個從 JsonConverter 繼承的型別以在我的類屬性中設定。
這是我不知道如何進行的地方。
public class LinksJsonConverter : JsonConverter
{
public override bool CanWrite => false;
public override bool CanConvert(Type objectType)
=> objectType == typeof(Links);
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var links = new Links();
if (reader.TokenType == JsonToken.StartArray || reader.TokenType == JsonToken.EndArray)
return links; // try return null
JObject jo = JObject.Load(reader);
links.Previous = jo["Previous"]?.ToString() ?? string.Empty;
links.Next = jo["Next"]?.ToString();?? string.Empty;
return links;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
=> ...
}
課程:
public class Links
{
public string Previous { get; set; }
public string Next { get; set; }
}
public class Pagination
{
public int Total { get; set; }
public int Count { get; set; }
[JsonProperty("per_page")]
public int PerPage { get; set; }
[JsonProperty("current_page")]
public int CurrentPage { get; set; }
[JsonProperty("total_pages")]
public int TotalPages { get; set; }
[JsonConverter(typeof(LinksJsonConverter))]
public Links Links { get; set; }
}
當我嘗試從空的“鏈接”屬性轉換時的錯誤。當值為空陣列時:
Message:
Test method IntegrationDownloaderServiceTests.ShouldProcessResultNfe threw exception:
Newtonsoft.Json.JsonSerializationException: Unexpected token when deserializing object:
EndArray. Path 'meta.pagination.links', line 123, position 17.
如何解決這個案子?
uj5u.com熱心網友回復:
在第一步將鏈接反序列化為物件:
public class Pagination
{
public int total { get; set; }
public int count { get; set; }
public int per_page { get; set; }
public int current_page { get; set; }
public int total_pages { get; set; }
public object links { get; set; }
}
public class Meta
{
public Pagination pagination { get; set; }
}
public class Root
{
public Meta meta { get; set; }
}
然后檢查鏈接型別:(這個)
public static class TypeExtensions
{
public static bool IsArrayOf<T>(this Type type)
{
return type == typeof (T[]);
}
}
并決定是否將物件轉換為陣列。
uj5u.com熱心網友回復:
我可能對我的問題不夠清楚。
我想忽略陣列值(至少現在),直到有意義的那一天。
在此 API 的檔案中,我沒有找到有關它的參考資料。
我會嘗試聯系開發商。
它是這樣作業的:
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
JObject jo = JObject.Load(reader);
var links = new Links
{
Previous = jo["previous"]?.Value<string>() ?? string.Empty,
Next = jo["next"]?.Value<string>() ?? string.Empty
};
return links;
}
else if (reader.TokenType == JsonToken.StartArray)
{
reader.Skip();
}
return null;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376083.html
上一篇:C#序列化JSON陣列而不使用類
