gpt4 book ai didi

java - Jackson - 在没有自定义序列化程序的情况下更改映射键名称

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:47:12 25 4
gpt4 key购买 nike

当使用 Jackson 序列化 Person 类时,Person 是:

public class Person {

private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

@Override
public String toString() {
return "My name is "+name+" ("+age+")";
}

}

我得到以下输出:

Map<Person, String> map = new HashMap<>();
Person john = new Person("John", 20);
map.put(john, "abc");

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(System.out, map); //1
objectMapper.writeValue(System.out, john); //2

1:

{"My name is John (20)":"abc"}

2:

{"name":"John","age":20}

有没有一种简单的方法(没有自定义序列化器)来更改映射键以使用 name 属性而不是 toString 输出在#1 中,不丢失 #2 中 Person 对象的序列化输出,并且不更改 toString 返回值?我希望有一个用于执行此操作的 getName 注释,但似乎找不到它。

最佳答案

自定义序列化器和 addKeySerializer 似乎是更好的方法,尽管创建模块、添加序列化器或 KeySerializer 然后向映射器注册模块有点麻烦。

如果出于某种原因(如您所述)您无法使用自定义序列化程序。以下是一些可能对您有所帮助的选项

两者都产生输出

{"John":"abc"}

写 map 时,但保持单个对象不变

{"name":"John","age":20}

Java 8 流映射输出

根据您的真实对象的复杂程度,与简单示例相比,您可以在 writeValue 调用期间或之前简单地进行映射。

    mapper.writeValue(System.out,
map.entrySet().stream().collect(
Collectors.toConcurrentMap(
k -> k.getKey().getName(),
Function.identity())));

在集合上实现 JsonSerializable

如果您能够将集合更改为扩展 HashMap 的自定义版本。

class PersonHashMap extends HashMap<Person, String> implements JsonSerializable {

@Override
public void serialize(JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
for (Entry<Person, String> e : entrySet()) {
jsonGenerator.writeStringField(e.getKey().getName(), e.getValue());
}
jsonGenerator.writeEndObject();
}

@Override
public void serializeWithType(JsonGenerator jsonGenerator, SerializerProvider serializerProvider, TypeSerializer typeSerializer) throws IOException {
.
.
.
}
}

缺点是你需要控制 map 的初始化,做这样的事情:

Map<Person, String> map = new PersonHashMap();

但话又说回来,这就是所有需要的,不需要额外的模块,也不需要像使用 JsonSerializer 那样注册对象映射器。

关于java - Jackson - 在没有自定义序列化程序的情况下更改映射键名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51091942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com