4.11. JSON 的更改
本节描述了 JSON 中的更改。
4.11.1. Jackson 的封装
JSON 类中的所有实现 Jackson 类型的方法均已被删除。使用以下方法之一:
删除的字段/Methods | 新方法 |
---|---|
|
|
|
|
|
|
|
|
例如,使用以下代码:
使用 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)
-
类型
-
JsonObject
和JsonArray
-
映射
和列表
-
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 和
的帮助程序功能仅启用 JSON 迁移。如果您使用对象映射将 JSON 对象自动映射到应用程序中的 Java POJO,则必须创建一个自定义对象映射程序,将 Base64 字符串转换为 Base64URL。
toBase64
Url
以下示例演示了如何使用自定义 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
方法已被删除。