[英]System.Text.Json JsonSerializer.Deserialize<TValue>(...) cannot deserialize object[] type
[英]csharp JsonSerializer in System.Text.Json cannot handle certain characters with StringEnumConverter
在 dotnet 6 上,System.Text.Json JsonSerializer 无法解析以“<”等字符开头的枚举。 这里有一个复制品:
https://dotnetfiddle.net/O3MdPn
过于简化,
using System;
using System.Runtime.Serialization;
using System.Text.Json;
using System.Text.Json.Serialization;
public class Program {
public enum Operator {
[EnumMember(Value = "<=")] LessOrEqual,
[EnumMember(Value = "lesseq")] LessEq,
}
public class BasicJson {
public Operator Operator {get; init;}
}
public static void Main() {
JsonSerializerOptions SerializationOptions = new() {
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
IgnoreNullValues = true,
Converters = {
new JsonStringEnumConverter()
},
};
var serialized = JsonSerializer.Deserialize<BasicJson>("{\"operator\": \"<=\"}", SerializationOptions);
Console.Write($"{serialized.Operator}");
}
}
导致以下错误
Unhandled exception. System.Text.Json.JsonException: The JSON value could not be converted to Program+Operator. Path: $.operator | LineNumber: 0 | BytePositionInLine: 17.
at System.Text.Json.ThrowHelper.ThrowJsonException(String message)
at System.Text.Json.Serialization.Converters.EnumConverter`1.ReadAsPropertyNameCore(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
at System.Text.Json.Serialization.Converters.EnumConverter`1.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 utf8Json, JsonTypeInfo jsonTypeInfo, Nullable`1 actualByteCount)
at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 json, JsonTypeInfo jsonTypeInfo)
at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)
at Program.Main()
将“<=”更改为“lesseq”按预期工作。 是否需要更改一些序列化设置以支持“<”等特殊字符?
编辑:
似乎 System.Text.Json 不尊重 EnumMember 属性,它实际上与特殊字符没有任何关系,只是序列化程序只能解析枚举名称的完全匹配(或者骆驼大小写匹配,如果你将其指定为命名策略)。
A workaround is to use Macross.Extensions.Json package: https://www.nuget.org/packages/Macross.Json.Extensions/
然后添加
Converters = {
new Macross.Json.Extensions.JsonStringEnumMemberConverter(),
new JsonStringEnumConverter()
},
给转换器。 这会根据枚举的 EnumMember Value 属性正确解析枚举。
添加到原始帖子中,但这是解决方案:
似乎 System.Text.Json 不尊重 EnumMember 属性,它实际上与特殊字符没有任何关系,只是序列化程序只能解析枚举名称的完全匹配(或者骆驼大小写匹配,如果你将其指定为命名策略)。
A workaround is to use Macross.Extensions.Json package: https://www.nuget.org/packages/Macross.Json.Extensions/
然后添加
Converters = {
new Macross.Json.Extensions.JsonStringEnumMemberConverter(),
new JsonStringEnumConverter()
},
给转换器。 这会根据枚举的 EnumMember Value 属性正确解析枚举。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.