jsonb - JSON-B 使用 toString 而不是注册的 Adapter 序列化 Map 键
问题描述
我有一个返回 a 的 JAX-RS 服务,Map<Artifact, String>
并且我已经注册了一个
public class ArtifactAdapter implements JsonbAdapter<Artifact, String>
在反序列化参数时看到命中,但在序列化返回值时没有看到命中,而是使用 Artifact toString()。如果我将返回类型更改为 Artifact,则会调用适配器。我的印象是 Map 将使用内置方式进行序列化,然后为 Artifact 调用适配器。
解决方法是什么?为整个地图注册一个适配器?
我将线程堆栈转储到我的 toString 中,它证实了我的怀疑
at java.lang.Thread.dumpStack(Thread.java:1336)
Artifact.toString(Artifact.java:154)
at java.lang.String.valueOf(String.java:2994)
at org.eclipse.yasson.internal.serializer.MapSerializer.serializeInternal(MapSerializer.java:41)
at org.eclipse.yasson.internal.serializer.MapSerializer.serializeInternal(MapSerializer.java:30)
at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:63)
at org.eclipse.yasson.internal.Marshaller.serializeRoot(Marshaller.java:118)
at org.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:74)
at org.eclipse.yasson.internal.JsonBinding.toJson(JsonBinding.java:98)
在这一点上,序列化程序是否一心想要使用 toString?
我试过了
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
公共类 PersonAdapter 实现 JsonbAdapter{
@Override
public String adaptToJson(Person obj) throws Exception {
return obj.getName();
}
@Override
public Person adaptFromJson(String obj) throws Exception {
return new Person(obj);
}
}
公共类测试{
public static void main(String[] args) {
Map<Person, Integer> data = new HashMap<>();
data.put(new Person("John"), 23);
JsonbConfig config = new JsonbConfig().withAdapters(new PersonAdapter());
Jsonb jsonb = JsonbBuilder.create(config);
System.out.println(jsonb.toJson(data, new HashMap<Person, Integer>() {
}.getClass().getGenericSuperclass()));
}
}
但仍然以 Person 的 toString() 结束
在此先感谢,尼克
解决方案
https://github.com/eclipse-ee4j/yasson/issues/110(在我的情况下,因为这是 WildFly 的默认提供程序)
推荐阅读
- wcf - 如何确保证书在 WCF 中是安全的
- php - 如何在 WooCommerce 商店页面上隐藏库存少于 2 的产品
- spring-boot - 我正在尝试一个 Spring Boot 示例,但它显示以下错误.. 我该怎么办?
- ansible - 如何在 Ansible 剧本中从 Git Lab 克隆项目?
- html - 居中按钮,无论列表中有多少
- excel - 是否有其他方法可以在不使用数组公式的情况下在 excel 中提取唯一值?
- android - 注册回调函数以从android(JNI或JNA)开始
- google-cloud-platform - 无法在 Google Cloud Platform 上创建 Dataproc 集群“NodeInitializationAction 必须指定可执行文件”
- android - How do I retrieve the JSON response for each click on Google Map Marker?
- jenkins - 如何使用 jenkins (CI/CD) 在 IBM Content Navigator 中部署 IBM Content Navigator 插件?