首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonSerializer在System.Text.Json中不能用StringEnumConverter处理某些字符

JsonSerializer在System.Text.Json中不能用StringEnumConverter处理某些字符
EN

Stack Overflow用户
提问于 2022-01-04 18:45:16
回答 1查看 1.1K关注 0票数 1

在dotnet 6上,System.Text.Json JsonSerializer无法解析以"<“等字符开头的枚举。这里有一个复制品:

https://dotnetfiddle.net/O3MdPn

过于简单化,

代码语言:javascript
复制
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}");

    }

}

结果出现以下错误

代码语言:javascript
复制
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属性,它实际上与特殊字符无关,只是序列化程序只能解析枚举名称的精确匹配(如果指定为命名策略,则camel大小写匹配)。

解决方法是使用Macross.Extensions.Json包:https://www.nuget.org/packages/Macross.Json.Extensions/

然后添加

代码语言:javascript
复制
    Converters = {
                new  Macross.Json.Extensions.JsonStringEnumMemberConverter(),
                new JsonStringEnumConverter()
            },

到转换器上。这将根据枚举的EnumMember值属性正确地解析枚举。

EN

回答 1

Stack Overflow用户

发布于 2022-01-04 19:28:41

添加到原来的帖子中,但以下是决议:

似乎System.Text.Json不尊重EnumMember属性,它实际上与特殊字符无关,只是序列化程序只能解析枚举名称的精确匹配(如果指定为命名策略,则camel大小写匹配)。

解决方法是使用Macross.Extensions.Json包:https://www.nuget.org/packages/Macross.Json.Extensions/

然后添加

代码语言:javascript
复制
Converters = {
            new  Macross.Json.Extensions.JsonStringEnumMemberConverter(),
            new JsonStringEnumConverter()
        },

到转换器上。这将根据枚举的EnumMember值属性正确地解析枚举。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70583651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档