java - 使用 JSON-B 将 UUID 序列化为 JSON 中的规范十六进制字符串

标签 java json data-binding binding jsonb-api

UUID

一个universally unique identifier (UUID)是一个 128 位值。在 Java 中表示为 java.util.UUID类。

十六进制字符串

为了显示和序列化,它被规范地格式化为 36 个字符的十六进制字符串,排列为由连字符分隔的五组。 For example :
fd95cb46-8ec3-11e8-9eb6-529269fb1459

当使用 Java 标准 XML 和 JSON API 进行序列化时,我期望这个十六进制字符串。对于 XML 有效,但对于 JSON 失败。我没有对 XML 或 JSON 使用任何类型的注释。我的简单POJOXML一无所知也不JSON .

XML = 成功👍

当我使用 JSR 222: JavaTM Architecture for XML Binding (JAXB) 2.0 的标准 XML 绑定(bind)框架生成 XML 时, 成功。我按预期得到了十六进制字符串。查看此代码段的最后一个元素:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<panel>
    <connected>3.4kVA</connected>
    <fedFrom>PANEL 'EHE1' &amp; ATS-EM</fedFrom>
    <grounding>ground bus</grounding>
    <id>89d14b92-35ae-4c0c-b61d-ea8dbdeb324b</id>

JSON = 失败👎

当我通过 JSR 367: JavaTM API for JSON Binding (JSON-B) 的标准 JSON 绑定(bind)框架运行相同的 panel 对象时, 失败。我得到的不是预期的十六进制字符串,而是数字。

{"connected":"3.4kVA","fedFrom":"PANEL 'EHE1' & ATS-EM","grounding":"ground bus","id":{"leastSignificantBits":-5323841289984462261,"mostSignificantBits":-8515942329042973684},

如果您滚动鼠标,您将看到名为 id 的 UUID 显示为一对数字而不是十六进制字符串:

"id":{"leastSignificantBits":-5323841289984462261,"mostSignificantBits":-8515942329042973684}

是否有某种方法可以使 JSON 绑定(bind)的行为与 XML 绑定(bind)一样?我想要十六进制字符串,而不是一对 64 位数字。

当然,这个编码值在解码、重新合并到 Java 对象中时应该可以工作。

最佳答案

JSON-B 规范没有提及 UUID 类型,因此是否提供开箱即用的(反)序列化器取决于实现。但是,如果您使用 Eclipse Yasson(JSON-B ref impl),它默认提供 UUID(反)序列化器。我不确定其他 JSON-B 实现(例如 Apache Johnzon)默认提供什么。

如果您使用 Yasson,我建议您在 their GitHub repo 上打开一个 bug ,因为这应该有效。

<小时/>

自定义方式

如果您使用的 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;
}

关于java - 使用 JSON-B 将 UUID 序列化为 JSON 中的规范十六进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51487864/

相关文章:

java - System.currentTimeMillis() 什么时候会溢出?

json - 无法将数据集从SPARK传输到HBase表

javascript - 有没有更短的方法

c# - 在 C# WinForm 控件(文本框、组合框、标签)中显示 SQL 数据库中的数据

java - Android OpenGL-ES 删除 2 个纹理之间的 Alpha channel

java - Spring 3 : Inject Default Bean Unless Another Bean Present

javascript - Ajax 调用 promise 未得到解决

wpf - 您可以在 XAML 中向数据绑定(bind) ItemsControl 添加额外的项目吗?

data-binding - 仅当函数的参数是临时参数时, `:as` 绑定(bind)才有用吗?

java - 任何人都可以帮助解决 Netbeans 运行 java 代码中的以下问题吗