jackson 我应该如何将JSON负载的大小写转换为较低的 Camel 大小写?

fv2wmkja  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(177)

我正在处理属性名为snake大小写的JSON,但是,我需要将这些属性名转换为较低的camel大小写。
我没有对应于所有对象的bean,所以Jackson通常的ser-de技巧不适用(我认为)。
我试着将它读入Map并设置一个全局属性命名策略,但没有成功。

String json = "{\"first_name\": \"John\", \"last_name\": \"Doe\" }";

    Map<?, ?> myMap = new ObjectMapper().readValue(json, Map.class);
    System.out.println(new ObjectMapper()
            .setPropertyNamingStrategy(new UpperCamelCaseStrategy())
            .writerWithDefaultPrettyPrinter()
            .writeValueAsString(myMap));

我并不需要在Jackson身上完成这一点,虽然这是一个简单的问题,但它确实让我很困惑,不知道什么是一种理智的方式来完成这一点。

2j4z5cfb

2j4z5cfb1#

我找到了这个解决方案,它有点硬编码,使用regex。但是,这样就不需要使用任何JsonObject库。
我写了三种方法:
1.一个用于将字符串从snake_case转换为pascalCase

private static String convertToPascalCase(String str){
    while(str.contains("_")) {
        str = str.replaceFirst("_[a-z]", String.valueOf(Character.toUpperCase(str.charAt(str.indexOf("_") + 1))));
    }
    return str;
}

1.另一个处理正则表达式匹配的替换

private static String replaceMatches(Matcher m, Function<MatchResult, String> mapping) {
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        MatchResult matchResult = m.toMatchResult();
        m.appendReplacement(sb, mapping.apply(matchResult));
    }
    m.appendTail(sb);

    return sb.toString();
}

1.最后一个定义适当的正则表达式,然后调用replaceMatches

public static String convertToPascalCaseAllJsonKeys(String jsonString) {
    Pattern p = Pattern.compile("\"(\\w+)\":");
    Matcher m = p.matcher(jsonString);
    return replaceMatches(m, mr -> "\"" + convertToPascalCase(mr.group(1)) + "\":");
}

用法如下:

String json = "{\"first_name\": \"John\", \"last_name\": \"Doe\", \"children\": [\"Jane\", \"Mary\", \"Harry\"]}";
String jsonWithPascalKey = convertToPascalCaseAllJsonKeys(json);

System.out.println(jsonWithPascalKey );
// result: {"firstName": "John", "lastName": "Doe", "children": ["Jane", "Mary", "Harry"]}

然后,您可以轻松地将字符串转换为JsonObject。

vngu2lb8

vngu2lb82#

https://github.com/octomix/josson
如果JSON有一个级别。

Josson josson = Josson.fromJsonString("{\"first_name\": \"John\", \"last_name\": \"Doe\"}");
JsonNode node = josson.getNode("entries().map(key.camelCase()::value).mergeObjects()");
System.out.println(node.toPrettyString());

输出量

{
  "firstName" : "John",
  "lastName" : "Doe"
}

为每个附加级别再嵌套一次转换查询。

Josson josson = Josson.fromJsonString("{\"sales_person\":{\"first_name\": \"John\", \"last_name\": \"Doe\"}}");
JsonNode node = josson.getNode(
    "entries()" +
    ".map(key.camelCase()" +
    "     ::value.entries()" +
    "       .map(key.camelCase()" +
    "            ::value)" +
    "       .mergeObjects())" +
    ".mergeObjects()");
System.out.println(node.toPrettyString());

输出量

{
  "salesPerson" : {
    "firstName" : "John",
    "lastName" : "Doe"
  }
}

相关问题