我最近花了很多時間將舊的 asp.net 4.6 專案升級到 .Net 6。
我幾乎可以正常作業,但是System.Text.Json在代替 Newtonsoft 使用時遇到了麻煩。
在我的 Startup.cs 中,我嘗試使用這樣的自定義轉換器:
services.AddMvc()
.AddJsonOptions(opts => {
//custom converter for PlayerItemDto
opts.JsonSerializerOptions.Converters.Add(new PlayerItemConverter());
});
這是我嘗試進行轉換的地方。這就是 Newtonsoft 現在的全部內容,我不確定這是否適用于System.Text.Json.
具體來說,我找不到任何System.Text.Json替代var obj = JObject.Load(reader);和options.Populate(obj.CreateReader(), retval)
有誰知道這是否可能?
這是我的轉換器類:
public class PlayerItemConverter : CustomCreationConverter<PlayerItemDto>
{
public PlayerItemDto Create(String morality)
{
switch (morality) {
case "bad":
return new MonsterTypeDto();
case "good":
return new LeaderTypeDto();
}
}
public override Object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var obj = JObject.Load(reader);
var morality = (String) obj.Property("morality");
var retval = Create(morality);
serializer.Populate(obj.CreateReader(), retval);
return retval;
}
}
uj5u.com熱心網友回復:
您的轉換器需要從 JsonConverter 派生,并實作 CanConvert、Read 和 Write,例如:
public class PlayerItemConverter : JsonConverter<PlayerItemDto>
{
public override bool CanConvert(Type typeToConvert)
{
return typeof(PlayerItemDto).IsAssignableFrom(typeToConvert);
}
public override PlayerItemDto Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
using (JsonDocument jsonDoc = JsonDocument.ParseValue(ref reader))
{
// Convert your jsonDoc into a PlayerItemDto and return it
}
}
public override void Write(Utf8JsonWriter writer, PlayerItemDto value, JsonSerializerOptions options)
{
JsonSerializer.Serialize(writer, value, options);
}
}
然后,您可以注冊您的轉換器,或使用類上的屬性宣告它,例如:
[JsonConverter(typeof(PlayerItemConverter))]
public class PlayerItemDto
{
}
更新
考慮類:
public class PlayerItemDto
{
public string Name { get; set; }
public int Age { get; set; }
public AddressDto Address { get; set; }
}
public class AddressDto
{
public int HouseNumber { get; set; }
public string Street { get; set; }
}
您可以使用以下方式訪問屬性:
using (JsonDocument jsonDoc = JsonDocument.ParseValue(ref reader))
{
string name = jsonDoc.RootElement.GetProperty("Name").GetString();
int age = jsonDoc.RootElement.GetProperty("Age").GetInt32();
int houseNumber = jsonDoc.RootElement.GetProperty("Address").GetProperty("HouseNumber").GetInt32();
string street = jsonDoc.RootElement.GetProperty("Address").GetProperty("Street").GetString();
// Build your PlayerItemDto from the properties
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/483906.html
標籤:C# asp.net 核心 .net-6.0 system.text.json
上一篇:如何將$(document).ready(function)更改為onload特殊標簽,以便將變數傳遞給js函式
