4.11. JSON 的更改


本节描述了 JSON 中的更改。

4.11.1. Jackson 的封装

JSON 类中的所有实现 Jackson 类型的方法均已被删除。使用以下方法之一:

删除的字段/Methods新方法

JSON.mapper () 字段

DatabindCodec.mapper()

Json.prettyMapper() field

DatabindCodec.prettyMapper()

Json.decodeValue(Buffer, TypeReference<T>)

JacksonCodec.decodeValue(Buffer, TypeReference)

Json.decodeValue(String, TypeReference<T>)

JacksonCodec.decodeValue(String, TypeReference)

例如,使用以下代码:

  • 使用 Jackson TypeReference 时:

    • 在 Eclipse Vert.x 3.x 版本中:

      List<Foo> foo1 = Json.decodeValue(json, new TypeReference<List<Foo>>() {});
    • 在 Eclipse Vert.x 4 版本中:

      List<Foo> foo2 = io.vertx.core.json.jackson.JacksonCodec.decodeValue(json, new TypeReference<List<Foo>>() {});
  • 引用 ObjectMapper

    • 在 Eclipse Vert.x 3.x 版本中:

      ObjectMapper mapper = Json.mapper;
    • 在 Eclipse Vert.x 4 版本中:

      mapper = io.vertx.core.json.jackson.DatabindCodec.mapper();
  • 设置 ObjectMapper

    • 在 Eclipse Vert.x 3.x 版本中:

      Json.mapper = someMapper;
    • 从 Eclipse Vert.x 4 开始,您无法编写映射程序实例。您应该使用自己的静态映射程序或配置 Databind.mapper () 实例。

4.11.2. 对象映射

在早期版本中,运行时需要 Jackson core 和 Jackson databind 依赖项。

从 Eclipse Vert.x 4 onward 中,只需要 Jackson 核心依赖项。

只有在对象映射 JSON 时,才需要 Jackson databind 依赖项。在这种情况下,您必须在 com.fasterxml.jackson.core:jackson-databind jar 中明确添加项目描述符中的依赖关系。

上述类型支持以下方法。

  • Methods

    • JsonObject.mapFrom(Object)
    • JsonObject.mapTo (Class)
    • Json.decodeValue(Buffer, Class)
    • Json.decodeValue(String, Class)
    • Json.encode(Object)
    • Json.encodePrettily(Object)
    • Json.encodeToBuffer(Object)
  • 类型

    • JsonObjectJsonArray
    • 映射列表
    • Number
    • 布尔值
    • Enum
    • byte[]缓冲
    • 即时

只支持使用 Jackson bind 的方法:

  • JsonObject.mapTo(Object)
  • JsonObject.mapFrom(Object)

4.11.3. Base64 编码器更新为 JSON 对象和数组的 Base64URL

Eclipse Vert.x JSON 类型实现了 RFC-7493。在较早版本的 Eclipse Vert.x 中,实施会错误地使用 Base64 编码程序而不是 Base64URL。这个问题已在 Eclipse Vert.x 4 中修复,在 JSON 类型中使用 Base64URL encoder。

如果您要继续使用 Eclipse Vert.x 4 中的 Base64 编码器,您可以使用 旧的 配置标志。以下示例演示了如何在 Eclipse Vert.x 4 中设置配置标志。

java -Dvertx.json.base64=legacy ...

如果您部分迁移了从 Eclipse Vert.x 3.x 到 Eclipse Vert.x 4 的迁移,则应用程序将在版本 3 和 4 上进行。在这种情况下,您可以使用以下实用程序将 Base64 字符串转换为 Base64URL。

public String toBase64(String base64Url) {
  return base64Url
    .replace('+', '-')
    .replace('/', '_');
}

public String toBase64Url(String base64) {
  return base64
    .replace('-', '+')
    .replace('_', '/');
}

在以下情况下必须使用工具方法:

  • 在从 Eclipse Vert.x 3.x 版本迁移到 Eclipse Vert.x 4 时处理集成。
  • 处理与使用 Base64 字符串的其他系统互操作性。

使用以下示例代码将 Base64URL 转换为 Base64 编码程序。

String base64url = someJsonObject.getString("base64encodedElement")
String base64 = toBase64(base64url);

Base64 和 toBase64 Url 的帮助程序功能仅启用 JSON 迁移。如果您使用对象映射将 JSON 对象自动映射到应用程序中的 Java POJO,则必须创建一个自定义对象映射程序,将 Base64 字符串转换为 Base64URL。

以下示例演示了如何使用自定义 Base64 解码器创建对象映射程序。

// simple deserializer from Base64 to byte[]
class ByteArrayDeserializer extends JsonDeserializer<byte[]> {
  ByteArrayDeserializer() {
  }

  public byte[] deserialize(JsonParser p, DeserializationContext ctxt) {
    String text = p.getText();
    return Base64.getDecoder()
      .decode(text);
  }
}

// ...

ObjectMapper mapper = new ObjectMapper();

// create a custom module to address the Base64 decoding
SimpleModule module = new SimpleModule();
module.addDeserializer(byte[].class, new ByteArrayDeserializer());
mapper.registerModule(module);

// JSON to POJO with custom deserializer
mapper.readValue(json, MyClass.class);

4.11.4. 从信任选项中删除 JSON 转换器方法

TrustOptions.toJSON 方法已被删除。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.