[英]System.Text.Json deserialize uint
因此,似乎新的 Json 庫不會反序列化(甚至就此而言序列化) UInt32
類型。 在 MVC 應用程序中,以下內容在 POST 的有效負載中發送:
{
"Overrides":{
},
"Directions":{
"data1" : "data2"
},
"ModeId": "1782354543",
"TestNumber" : 10
}
它應該被序列化為的 class 是這樣的:
public class Payload
{
public uint ModeId;
public Dictionary<string, string> Directions{ get; set; } = new();
public Dictionary<string, string> Overrides { get; set; } = new();
public int TestNumber { get; set; }
}
但是當收到請求時, ModeId
為 0。我嘗試根據我在這里找到的單元測試添加自定義轉換器 像這樣:
public class UIntConverter : JsonConverter<uint>
{
public override uint Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
string stringValue = reader.GetString();
if (uint.TryParse(stringValue, out uint x))
{
return x;
}
}
if (reader.TokenType == JsonTokenType.Number)
{
return reader.GetUInt32();
}
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, uint value, JsonSerializerOptions options)
{
writer.WriteNumberValue(value);
}
}
並像這樣注冊它:
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.WriteIndented = false;
options.JsonSerializerOptions.IgnoreNullValues = true;
options.JsonSerializerOptions.PropertyNamingPolicy = null;
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
options.JsonSerializerOptions.Converters.Insert(options.JsonSerializerOptions.Converters.Count,new UIntConverter());
});
我什至未能使用相同的轉換器將我的 class 序列化為字符串。 它只是忽略了 uid 屬性。
var payload = new Payload()
{
Directions = new Directions
{
{"data1", "data2" }
},
ModeId = 1782354543,
TestNumber = 10
}
//then try to serialize
var defaultJsonSerializerSettings = new JsonSerializerOptions()
{
IgnoreNullValues = true,
WriteIndented = false,
PropertyNamingPolicy = null,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
Converters = { new UIntConverter()}
};
Serializer.Serialize(payload, typeof(Payload), defaultJsonSerializerSettings);
它序列化所有內容,除了完全被忽略的 uint 屬性。
您對 uint 屬性的序列化/反序列化有何建議/建議?
[更新]:問題是我試圖序列化/反序列化一個字段,而不是答案中指出的具有公共訪問器的屬性。 恰好該字段的類型為uint
。
如果您使用的是 .NET 5,或者 - 正如@Jimi 指出的那樣 - 安裝<PackageReference Include="System.Text.Json" Version="5.0.2" />
,那么您可以使用IncludeFields
和AllowReadingFromString
選項:
var serializeOptions = new JsonSerializerOptions
{
IncludeFields = true,
NumberHandling = JsonNumberHandling.AllowReadingFromString
};
var p = JsonSerializer.Deserialize<Payload>(json, serializeOptions);
在 .NET5 之前,您需要將 ModeId 更改為屬性。
順便提一句。 您可以在沒有轉換器的情況下處理字符串/整數:
public string ModeId {get; set}
public uint ModeIdParsed => uint.Parse(ModeId);
如果您需要保留ModeId
名稱,那么您可以
public class Payload
{
[JsonPropertyName("ModeId")]
public string modeId {get;set;}
[JsonIgnore]
public uint ModeId => uint.Parse(modeId);
}
不幸的是,在 3.1 中,您需要將字符串變體公開(反序列化私有可從 v5 獲得)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.