我有一個奇怪的json,它:
- 改不了了,第三方的
- 它最多可以有 75 個屬性
一個簡單的json示例:
{
"bookingcode":["ABC","DEF", "GHJ", "TEST"],
"referencenumber":[123, 456]
"bookingdate":["22-07-2022T14:00:30", "23-11-2022T17:00:25"]
}
我只對陣列的最后一個值感興趣,并想反序列化為一個名為 Booking 的類,所以在這種情況下bookingcode="TEST"和bookingdate="23-11-2022T17:00:25".
一個解決方案是定義一個模型:
public class Booking
{
public string BookingCode { get; set; }
public int ReferenceNumber { get; set; }
public DateTime BookingDate { get; set;}
}
public class BookingInput
{
public List<string> BookingCode { get; set;}
public List<int> ReferenceNumber { get; set; }
public List<DateTime> BookingDate { get; set; }
}
var bookinginput = JsonSerializer.Deserialize<BookingInput>(jsonString);
var booking = new Booking
{
BookingCode = bookinginput.BookingCode.Last(),
ReferenceNumber = bookinginput.ReferenceNumber.Last(),
...
}
我認為在這樣的代碼中寫出所有 75 個屬性是非常乏味的。Json.net 或 System.Text.Json 中是否有更好的解決方案?
uj5u.com熱心網友回復:
使用 NewtonSoft.Json,您可以創建自己的JsonConverter. 下面我創建了一個LastArrayItemJsonConverter,它從特定型別的陣列中獲取最后一項并回傳它。
public class LastArrayItemJsonConverter<TItem> : JsonConverter<TItem>
{
private string _formatString;
public LastArrayItemJsonConverter()
{ }
public LastArrayItemJsonConverter(string formatString)
{
_formatString = formatString;
}
public override TItem ReadJson(JsonReader reader, Type objectType, TItem existingValue, bool hasExistingValue, JsonSerializer serializer)
{
if (typeof(TItem) == typeof(DateTime) || typeof(TItem) == typeof(DateTime?))
reader.DateFormatString = _formatString;
TItem result = default;
if (reader.TokenType != JsonToken.StartArray)
return default;
while (reader.Read() && reader.TokenType != JsonToken.EndArray)
result = (TItem)Convert.ChangeType(reader.Value, typeof(TItem));
return result;
}
public override void WriteJson(JsonWriter writer, TItem value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
通過裝飾你的模型,你可以指定序列化器應該使用轉換器來轉換屬性:
public class Booking
{
[JsonConverter(typeof(LastArrayItemJsonConverter<string>))]
public string BookingCode { get; set; }
[JsonConverter(typeof(LastArrayItemJsonConverter<int>))]
public int ReferenceNumber { get; set; }
[JsonConverter(typeof(LastArrayItemJsonConverter<DateTime>), "dd-MM-yyyy\\THH:mm:ss")]
public DateTime BookingDate { get; set; }
}
現在,模型的屬性將使用陣列中的最后一個值填充。使用以下命令反序列化 json:
var booking = JsonConvert.DeserializeObject<Booking>(json)
uj5u.com熱心網友回復:
您可以定義一個Booking類,其中包括
- 的
BookingInput屬性 - 以及最后一項檢索邏輯
public class Booking
{
[JsonIgnore]
public string BookingCode => BookingCodes.Last();
[JsonIgnore]
public int ReferenceNumber => ReferenceNumbers.Last();
[JsonIgnore]
public DateTime BookingDate => BookingDates.Last();
[JsonProperty("bookingcode")]
public List<string> BookingCodes { get; set; } = new List<string>();
[JsonProperty("referencenumber")]
public List<int> ReferenceNumbers { get; set; } = new List<int>();
[JsonProperty("bookingdate")]
public List<DateTime> BookingDates { get; set; } = new List<DateTime>();
}
uj5u.com熱心網友回復:
如果你想使用你的自定義 C# 類
using Newtonsoft.Json;
var jsonParsed = JObject.Parse(json);
foreach (var arr in jsonParsed.Properties())
jsonParsed[arr.Name] = arr.Value.LastOrDefault();
Booking booking = jsonParsed.ToObject<Booking>();
但是由于您最多可以擁有 75 個屬性,因此使用字典而不是自定義類可能會更好
Dictionary<string, object> bookingDict = new Dictionary<string, object>();
foreach (var arr in jsonParsed.Properties())
bookingDict.Add(arr.Name, arr.Value.LastOrDefault());
結果
{
"bookingcode": "TEST",
"referencenumber": 456,
"bookingdate": "23-11-2022T17:00:25"
}
uj5u.com熱心網友回復:
如果您也提供您的請求代碼會更好。你添加了 ReadAsStringAsync(); 請求后?
public class Booking
{
[JsonProperty("bookingcode")]
public List<string> BookingCodes { get; set; } = new List<string>();
[JsonProperty("referencenumber")]
public List<int> ReferenceNumbers { get; set; } = new List<int>();
[JsonProperty("bookingdate")]
public List<DateTime> BookingDates { get; set; } = new List<DateTime>();
}
還有一些網路請求示例
using (var client = new HttpClient())
{
var response = await client.
GetAsync(apiEndpoint);
var responseText = await response.Content.ReadAsStringAsync();
var compareResult = JsonSerializer.Deserialize<Booking>(responseText)??new Booking();
return compareResult;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/518524.html
