
[英]Deserialise JSON to Dictionary where the JSON string contains a null value
[英]Deserialise Json to Dictionary<string, object> where object is native value type
我正在尝试反序列化Dictionary<string,object>
,但反序列化器返回Dictionary<string, JsonElement>
。
[Fact]
public void MyTestMethod()
{
// Arrange
var input = @"
{
""Key1"":""Value1"",
""Key2"":true
}";
// Act
var obj = JsonSerializer.Deserialize<Dictionary<string, object>>(input)!;
// Assert
Assert.Equal(typeof(string), obj["Key1"].GetType());
Assert.Equal(typeof(bool), obj["Key2"].GetType());
}
如何反序列化为原生值? (我知道字典永远不会有复杂的子对象)。
为此,您需要使用自定义转换器。 像这样的东西会起作用:
public class ObjectNativeTypeConverter : JsonConverter<object>
{
public override object? Read(ref Utf8JsonReader reader, Type typeToConvert,
JsonSerializerOptions options) => reader.TokenType switch
{
JsonTokenType.True => true,
JsonTokenType.False => false,
JsonTokenType.Number when reader.TryGetInt64(out long l) => l,
JsonTokenType.Number => reader.GetDouble(),
JsonTokenType.String when reader.TryGetDateTime(out DateTime datetime) => datetime,
JsonTokenType.String => reader.GetString()!,
_ => JsonDocument.ParseValue(ref reader).RootElement.Clone()
};
}
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
{
// An exercise for you if you need it
throw new NotImplementedException();
}
}
(注意:这几乎是从官方文档中逐字记录的)
并像这样使用它:
var options = new JsonSerializerOptions();
options.Converters.Add(new ObjectNativeTypeConverter());
var obj = JsonSerializer.Deserialize<Dictionary<string, object>>(input, options);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.