当前位置: 首页 > 面试题库 >

如何使JSON.NET StringEnumConverter使用连字符分隔的大小写

鲜于致远
2023-03-14
问题内容

我正在使用一个API,它返回这样的字符串值。 some-enum-value

我尝试将这些值放在一个枚举中,因为默认的StringEnumConverter不能完成工作,因此我尝试使用一些附加逻辑来装饰此Converter。如何确保正确反序列化了这些值?

以下代码是我完成此工作的尝试。然而,reader = new JsonTextReader(new StringReader(cleaned));由于base.ReadJson无法将字符串识别为JSON,所以这行打破了整个事情。

是否有更好的方法可以执行此操作而不必在StringEnumConverter中实现所有现有逻辑?如何解决我的方法?

public class BkStringEnumConverter : StringEnumConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.String)
        {
            var enumString = reader.Value.ToString();
            if (enumString.Contains("-"))
            {
                var cleaned = enumString.Split('-').Select(FirstToUpper).Aggregate((a, b) => a + b);
                reader = new JsonTextReader(new StringReader(cleaned));
            }
        }
        return base.ReadJson(reader, objectType, existingValue, serializer);
    }

    private static string FirstToUpper(string input)
    {
        var firstLetter = input.ToCharArray().First().ToString().ToUpper();
        return string.IsNullOrEmpty(input)
            ? input
            : firstLetter + string.Join("", input.ToCharArray().Skip(1));
    }
}

问题答案:

我通过在枚举值上添加EnumMember属性解决了该问题。Json.NET的默认值StringEnumConverter完美地处理了这些属性。

例:

public enum MyEnum
{
    [EnumMember(Value = "some-enum-value")]
    SomeEnumValue,
    Value,
    [EnumMember(Value = "some-other-value")]
    SomeOtherValue
}

请注意,您只需要指定属性即可,例如破折号或其他不能在枚举中使用的特殊字符。大写小写由来处理StringEnumConverter。因此,如果服务返回一个类似的值someenumvalue,则应在枚举中像这样使用它Someenumvalue。如果愿意SomeEnumValue,可以使用该EnumMember属性。万一服务以这种方式返回它,someEnumValue您就可以这样使用它SomeEnumValue(当您使用CamelCaseText属性时,它是开箱即用的)。

您可以在中轻松指定转换器和其他设置JsonSerializerSettings

这是我自己使用的设置的示例。

new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    Converters = new List<JsonConverter> { new StringEnumConverter { CamelCaseText = true } },
    NullValueHandling = NullValueHandling.Ignore
};


 类似资料:
  • 问题内容: 我需要在数据库中填充纬度和经度列,但是原始信息存储为单个字符串 例如。 我猜想TRIM命令在这里很有用,但是我不知道如何告诉它每半个部分都精确地停在逗号上。 我希望能够提出一个简单的UPDATE查询,如下所示: 但是显然在LTRIM和RTRIM部分中需要做一些额外的工作,因此我只选择数据,但不包括UDFChar1中的逗号。 关于如何实现这一目标的任何想法? 问题答案: 请试试: 和 样

  • 我正在构建一个名为“id”的查询参数,它是一个列表,所以我有类似于localhost:8080/application?id=1 (我知道我的方法不够,我需要写第一个?id=) 方法 我的问题是:为什么我收到这个错误在Collectors.joining(" 我正在使用OpenJDK

  • 我正在为一个intranet应用程序设计一个基于HTTP的API。我意识到这是一个很小的问题,但是:我应该使用连字符、下划线或camelCase来分隔URI中的单词吗? 以下是我最初的想法: 骆驼箱 null null null 我倾向于下划线。大多数大公司都在使用它们这一事实令人信服(参见https://stackoverflow.com/A/608458/360570)。

  • 问题内容: 在大量的Unicode字符中,有一些实际上代表多个字符,例如U + FB00连字ff表示两个’f’字符。有什么容易的方法可以将这样的字符转换成多个单个字符?最好是在标准Java API中可用的东西,但是如果需要,我可以引用一个外部库。 问题答案: U + FB00是兼容字符。通常,Unicode不支持连字的单独代码点(认为是否使用连字以及何时使用连字是布局决定,并且不影响数据的存储方式)

  • 问题内容: 我正在尝试为其中一个根据您的回答做出响应的程序编写代码。我想这样做,以便某些变量不区分大小写。例如,如果我的变量等于我希望它也等于。那可能吗? 到目前为止,这是我的代码: 我不想为每个答案都设置2种情况,其中一种是大写,另一种是小写。 稍微偏离主题的问题。如何关闭扫描仪的资源泄漏? 问题答案: 值得一提: 或简单地使用:

  • 问题内容: 什么正则表达式模式需要我传递给 拆分成字符串使用的所有空格字符(子字符串数组,等)作为分隔符? 问题答案: 某些东西 这会将所有空白分组为分隔符。 因此,如果我有字符串: 这将产生字符串并省略和之间的空白。 正如VonC指出的那样,应该转义反斜杠,因为Java首先会尝试将字符串转义为特殊字符,然后将其发送给解析。你想要的是字面量,这意味着你需要通过。可能会造成一些混乱。 在相当于。