代码之家  ›  专栏  ›  技术社区  ›  Basil Bourque

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

  •  1
  • Basil Bourque  · 技术社区  · 6 年前

    UUID公司

    一个 universally unique identifier (UUID) 是128位值用Java表示为 java.util.UUID 上课。

    十六进制字符串

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

    当使用Java标准XML&JSONAPI序列化时,我希望使用此十六进制字符串为XML工作,但为JSON失败我没有对XML或JSON使用任何类型的注释我的简单 POJO 什么都不知道 XML 也不是 JSON .

    XML=成功

    当我使用 JSR 222: 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' &amp; ATS-EM</fedFrom>
        <grounding>ground bus</grounding>
        <id>89d14b92-35ae-4c0c-b61d-ea8dbdeb324b</id>
    

    JSON=失败

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

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

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

    “id”:{“leatsignificantbits”:-5323841289984462261,“mostSignificantBits”:-8515942329042973684}

    有什么方法可以让JSON绑定像XML绑定那样工作吗我要的是十六进制字符串,而不是一对64位数字。

    当然,这个封送值应该在解封并重新水合为Java对象时工作。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Andy Guibert    6 年前

    JSON-B规范没有提到UUID类型,因此它是否提供现成的(反)序列化器取决于实现但是,如果您使用的是EclipseYasson(JSON-BRefImpl),那么默认情况下它确实提供了一个UUID(反)序列化程序我不确定默认情况下其他JSON-B impl(比如Apache Johnzon)提供了什么。

    如果你用的是Yasson,我建议你在 their GitHub repo ,因为这应该有效。


    定制方式

    如果您使用的是默认情况下不提供UUID适配器的JSON-B实现,则可以创建并注册自己的类型适配器:

    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;
    }