Jackson到json的Map(大小写不断变化)

mctunoxg  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(154)

我想把map转换成json,但是要用jackson来改变大小写。例如,我有一个map:

"test_first" -> 1,
 "test_second" -> 2,

我想把它转换成json,但是要把下划线大小写改为小写CamelCase。我该怎么做呢?使用这个方法没有帮助:

// Map<String, String> fields;

var mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE); 
// setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE) didn't help too
String json = mapper.writeValueAsString(fields);
3hvapo4f

3hvapo4f1#

在Jackson中有StringKeySerializer,它可以实现在一些Map中改变键的呈现的功能(例如,使用Guava CaseFormat):

// custom key serializer
class SnakeToCamelMapKeySerialiser extends StdKeySerializers.StringKeySerializer {
    @Override
    public void serialize(Object value, JsonGenerator g, SerializerProvider provider)
            throws IOException {
        g.writeFieldName(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, (String) value));
    }
}

// map with the custom serializer
@JsonSerialize(keyUsing = SnakeToCamelMapKeySerialiser.class)
class MyMap<K extends String, V> extends HashMap<K, V> {
}

然后,使用所需的格式序列化Map:

Map<String, Integer> map = new MyMap<>();
map.put("first_key", 1);
map.put("second_key", 2);

ObjectMapper mapper = new ObjectMapper();

String json = mapper.writeValueAsString(map);

System.out.println(json);
// -> {"firstKey":1,"secondKey":2}
jhdbpxl9

jhdbpxl92#

使用@JsonProperty注解。在属性变量或其getter上执行以下操作:

@JsonProperty("testFirst")
String test_first;

@JsonProperty("testSecond")
String test_second;

显然,你也可以使用@JsonGetter@JsonSetter注解作为替代。

相关问题