>UUID
通用唯一标识符 (UUID) 是 128 位值。在 Java 中由java.util.UUID
类表示。
十六进制字符串
为了显示和序列化,它被规范地格式化为 36 个字符的十六进制字符串,分为由连字符分隔的五组。例如:fd95cb46-8ec3-11e8-9eb6-529269fb1459
当使用Java标准的XML和JSON API进行序列化时,我希望这个十六进制字符串。适用于 XML,但适用于 JSON。我没有对XML或JSON使用任何类型的注释。我简单的POJO对XML和JSON一无所知。
XML = 成功 👍
当我使用 JSR 222 的标准 XML 绑定框架生成 XML 时:JavaTM Architecture for XML Binding (JAXB) 2.0,成功了。我按预期得到十六进制字符串。请参阅此代码段的最后一个元素:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<panel>
<connected>3.4kVA</connected>
<fedFrom>PANEL 'EHE1' & ATS-EM</fedFrom>
<grounding>ground bus</grounding>
<id>89d14b92-35ae-4c0c-b61d-ea8dbdeb324b</id>
JSON = 失败 👎
当我通过JSR 367的标准JSON绑定框架运行相同的panel
对象时:JavaTM API for JSON Binding(JSON-B)失败。我得到的不是预期的十六进制字符串,而是数字。
{"connected":"3.4kVA","fedFrom":"PANEL 'EHE1' & ATS-EM","grounding":"ground bus","id":{"leastSignificantBits":-5323841289984462261,"mostSignificantBits":-8515942329042973684},
如果滚动过去,您将看到名为id
的 UUID 显示为一对数字,而不是十六进制字符串:
id":{"minimumImportantBits":-5323841289984462261,"mostImportantBits":-8515942329042973684}
有没有办法让 JSON 绑定像 XML 绑定一样运行?我想要十六进制字符串,而不是一对 64 位数字。
当然,这个封送值应该在取消封送、重新冻结到 Java 对象中时起作用。
JSON-B 规范没有提到 UUID 类型,因此它是否提供开箱即用的(反)序列化程序取决于实现。 但是,如果您使用的是 Eclipse Yasson(JSON-B ref impl),则默认情况下它确实提供了 UUID (de)序列化程序。我不确定默认情况下提供的其他JSON-B含义(例如Apache Johnzon)。
如果您使用的是Yasson,我建议您在他们的GitHub存储库上打开一个错误,因为这应该有效。
定制方式
如果使用的 JSON-B 实现默认不提供 UUID 适配器,则可以创建并注册自己的类型适配器:
public static class MyUUIDAdapter implements JsonbAdapter<UUID, String> {
@Override
public String adaptToJson(UUID obj) throws Exception {
return obj.toString();
}
@Override
public UUID adaptFromJson(String obj) throws Exception {
return UUID.fromString(obj);
}
}
注册适配器的最简单方法是在创建Jsonb
实例时:
Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new MyUUIDAdapter()));
但是,如果您不控制Jsonb
实例的实例化(例如,JAX-RS 在幕后执行此操作),则可以注释要在其上使用适配器的字段/方法:
public class Panel {
@JsonbTypeAdapter(MyUUIDAdapter.class)
public UUID id;
}