Jackson将Map转换为JSON并更改大小写

4
我想使用Jackson将地图转换为JSON,并更改大小写。例如,我有以下地图:
 "test_first" -> 1,
 "test_second" -> 2,

我想将它转换为JSON,但要将下划线命名法改为小驼峰命名法。我该怎么做?使用以下代码没有帮助:
// 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);

阅读API后,我理解需要使用SnakeCaseStrategy来反向操作:PropertyNamingStrategy.SnakeCaseStrategy 一种属性命名策略,将典型的驼峰式Java属性名称转换为小写的JSON元素名称,用下划线分隔。但是我不确定它是否适用于简单的映射键,因为该键不是Java对象的属性。 - The Frozen One
@TheFrozenOnem,我不明白,你是说它会将CamelCase更改为下划线,但我需要做相反的事情:从下划线映射到包含camelCase的JSON字符串。 - Arzybek
好的,明白了。如果你上面的JSON样式示例是一个Java对象,那么你应该将它作为Java对象发布,例如 Map<> someMap = new HashMap();。 你还应该发布你的输出或者你所面临的问题。 不管怎样,我认为已经有其他人解释过了: https://dev59.com/fV0a5IYBdhLWcg3wFlRH#39413177 - The Frozen One
@TheFrozenOne,下次请仔细阅读问题,没有一种被接受的样式来显示地图的值,所以我像这样写它,这并不重要,因为我之前字面上写过“我有这个地图:”。而你链接的问题则相反:从JSON到地图,并且并不有用,因为它是硬编码到只有一个用例:从UpperCamelCase到lowerCamelCase。 - Arzybek
它确切地描述了解决您问题的方法。如果您提供一个清晰完整的示例,它可能会帮助其他人来帮助您。 - The Frozen One
@TheFrozenOne,不是这样的,我已经解释过了,关于“明显的例子”:在你链接的问题中,作者描述了一个地图,就像我在第一个版本中所做的那样,我想那时候已经很清楚了,那么问题出在哪里呢? - Arzybek
2个回答

2

在Jackson中有一个StringKeySerializer,它可以实现改变某些映射中键的呈现方式的功能(例如使用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<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}

1
使用@JsonProperty注释。在属性变量上或其getter上执行此操作:
@JsonProperty("testFirst")
String test_first;

@JsonProperty("testSecond")
String test_second;

显然,你也可以使用@JsonGetter@JsonSetter注释作为替代方案。在Jackson Annotation Examples文章中了解更多信息。


这并不是因为我正在转换一个地图,而不是一个对象。 - Arzybek
好的,不确定在地图中该如何实现。 - Michael Gantman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接