I want to convert map to json but with changing case using jackson. For example, I have this map:
"test_first" -> 1,
"test_second" -> 2,
I want to convert it to json but with changing from underscore case to lowerCamelCase. How do I do that? Using this didn't help:
// 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);
Use @JsonProperty annotation. Over your property variable or over its getter do this:
@JsonProperty("testFirst")
String test_first;
@JsonProperty("testSecond")
String test_second;
Apparently you can also use @JsonGetter and @JsonSetter annotations as an alternative. Read about it in Jackson Annotation Examples areticle
There is StringKeySerializer in Jackson which may implement the functionality to change presentation of the keys in some map (e.g. using 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> {
}
Then the map is serialized with the required format:
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}