JSON
在java语言中,java并没有对json提供原生的支持。但在Vert.x中有两个类提供这样的支持。
JSON 对象
JsonObject类用来描述JSON对象。
一个JSON 对象基本上只是一个 Map 结构。它具有字符串的键,值可以是任意一种JSON 支持的类型(如 string, number, boolean)。
JSON 对象也支持 null
值。
创建 JSON 对象
可以使用默认构造函数创建空的JSON对象。
您可以通过一个 JSON 格式的字符串创建JSON对象:
String jsonString = "{\"foo\":\"bar\"}";
JsonObject object = new JsonObject(jsonString);
您可以从通过一个Map创建JSON对象:
Map<String, Object> map = new HashMap<>();
map.put("foo", "bar");
map.put("xyz", 3);
JsonObject object = new JsonObject(map);
将键值对放入 JSON 对象
使用put
方法可以将值放入到JSON对象里。
这个API是流式的,因此这个方法可以被链式地调用。
JsonObject object = new JsonObject();
object.put("foo", "bar").put("num", 123).put("mybool", true);
从 JSON 对象获取值
您可使用 getXXX
方法从JSON对象中获取值。例如:
String val = jsonObject.getString("some-key");
int intVal = jsonObject.getInteger("some-other-key");
JSON 对象和 Java 对象间的映射
您可以从 Java 对象的字段创建一个JSON 对象,如下所示:
你可以通过一个JSON 对象来实例化一个Java 对象并填充字段值。如下所示:
request.bodyHandler(buff -> {
JsonObject jsonObject = buff.toJsonObject();
User javaObject = jsonObject.mapTo(User.class);
});
请注意上述代码直接使用了 Jackson 的 ObjectMapper#convertValue()
来执行映射。关于字段和构造函数的可见性的影响、对象引用的序列化和反序列化的问题等等可参考 Jackson 的文档获取更多信息。
在最简单的情况下,如果 Java 类中所有的字段都是 public
(或者有 public
的 getter/setter)时,并且有一个 public
的默认构造函数(或不定义构造函数),mapFrom
和 mapTo
都应该成功。
只要不存在对象的循环引用,嵌套的 Java 对象可以被序列化/反序列化为嵌套的JSON对象。
将 JSON 对象编码成字符串
您可使用 encode
方法将一个对象编码成字符串格式。
JSON 数组
JsonArray
类用来描述 JSON数组。
一个JSON 数组是一个值的序列(值的类型可以是 string、number、boolean 等)。
JSON 数组同样可以包含 null
值。
创建 JSON 数组
可以使用默认构造函数创建空的JSON数组。
您可以从JSON格式的字符串创建一个JSON数组:
String jsonString = "[\"foo\",\"bar\"]";
JsonArray array = new JsonArray(jsonString);
将数组项添加到JSON数组
您可以使用 add
方法添加数组项到JSON数组中:
JsonArray array = new JsonArray();
array.add("foo").add(123).add(false);
从 JSON 数组中获取值
您可使用 getXXX
方法从JSON 数组中获取值。例如:
String val = array.getString(0);
Integer intVal = array.getInteger(1);
Boolean boolVal = array.getBoolean(2);
将 JSON 数组编码成字符串
您可使用 encode
将一个 JsonArray
编码成字符串格式。