【发布时间】:2021-07-17 04:22:16
【问题描述】:
因此,新的 Json 库似乎没有反序列化(甚至为此序列化)UInt32 类型。在 MVC 应用程序中,以下内容在 POST 的有效负载中发送:
{
"Overrides":{
},
"Directions":{
"data1" : "data2"
},
"ModeId": "1782354543",
"TestNumber" : 10
}
它应该被序列化的类是这样的:
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。我尝试根据我找到的单元测试添加自定义转换器 here
像这样:
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());
});
我什至未能使用相同的转换器将我的类序列化为字符串。它只是忽略了 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。
【问题讨论】:
-
即,您在
public uint ModeId;中缺少{get; set;}(这是故意的吗?),那么您的转换器可以工作。 -- 不需要= new()。 -
uint 工作正常
-
@Keith Nicholas 是的,在选项中设置
NumberHandling = JsonNumberHandling.AllowReadingFromString。或者包括字段,设置IncludeFields = true。这么多的可能性......
标签: c# json asp.net-mvc json-deserialization system.text.json