Java的JSON处理
用于 JSON 处理的 Java API(JSON-P)提供可移植的 API,以使用对象模型和流式 API 来解析,生成,转换和查询 JSON。 JSON-P 中使用 JSON 的两种方式有两种:流式 API 和对象模型 API。
-
JSON-P 流式 API
流式 API 将解析和生成控制移交给程序员。 流式 API 提供了基于事件的解析器,并允许应用开发人员请求下一个事件,而不是在回调中处理该事件。 这称为拉方法。
名称 描述 Json 包含用于创建 JSON 解析器,生成器及其工厂的静态方法。 JsonParser 表示一个基于事件的解析器,它从流中读取 JSON 数据。 JsonGenerator 将 JSON 数据一次写入一个值。 -
JSON-P 对象模型 API
对象模型 API 创建一个树形结构,表示内存中的 JSON 数据。 可以灵活地导航和查询树。 另一方面,对象模型 API 的效率通常不如流模型,并且需要更多的内存。
名称 描述 Json
包含用于创建 JSON 解析器,生成器及其工厂的静态方法。 JsonObjectBuilder
通过添加应用代码中的值在内存中创建对象模型。 JsonArrayBuilder
通过添加应用代码中的值在内存中创建数组模型。 JsonReader
从输入源读取 JsonObject
或JsonArray
。JsonWriter
将 JsonObject
或JsonArray
写入输出源。 -
JSON-P
JsonObjectBuilder
示例public class JsonObjectBuilderEx { public static void main(String[] args) { var born = LocalDate.of(1992, 3, 2).toString(); var json = Json.createObjectBuilder() .add("name", "John Doe") .add("occupation", "gardener") .add("born", born).build(); var result = json.toString(); System.out.println(result); } }
用
createObjectBuilder()
创建一个JsonObjectBuilder
。 新的对将插入add()
。 最后,使用build()
结束字符串。var json = Json.createObjectBuilder() .add("name", "John Doe") .add("occupation", "gardener") .add("born", born).build();
输出:
{"name":"John Doe","occupation":"gardener","born":"1992-03-02"}
PRETTY_PRINTING
通过
JsonGenerator.PRETTY_PRINTING
配置设置,我们可以设置写入器进行漂亮的打印。public class JsonPrettyPrintEx { public static void main(String[] args) { var born = LocalDate.of(1992, 3, 2).toString(); var json = Json.createObjectBuilder() .add("name", "John Doe") .add("occupation", "gardener") .add("born", born).build(); var config = new HashMap<String, Boolean>(); config.put(JsonGenerator.PRETTY_PRINTING, true); var jwf = Json.createWriterFactory(config); var sw = new StringWriter(); try (var jsonWriter = jwf.createWriter(sw)) { jsonWriter.writeObject(json); System.out.println(sw.toString()); } } }
配置文件被传递到
JsonWriterFactory
。var config = new HashMap<String, Boolean>(); config.put(JsonGenerator.PRETTY_PRINTING, true); var jwf = Json.createWriterFactory(config);
输出:
{ "name": "John Doe", "occupation": "gardener", "born": "1992-03-02" }
-
JSON-P
JsonArrayBuilder
JsonArrayBuilder
是用于创建和修改JsonArray
对象的构建器。public class JsonArrayBuilderEx { public static void main(String[] args) { var ab = Json.createArrayBuilder(); var users = createUsers(); users.forEach(user -> { var ob = Json.createObjectBuilder(); ob.add("name", user.getName()); ob.add("occupation", user.getOccupation()); ob.add("born", user.getBorn().toString()); ab.add(ob); }); var config = new HashMap<String, Boolean>(); config.put(JsonGenerator.PRETTY_PRINTING, true); var jwf = Json.createWriterFactory(config); var sw = new StringWriter(); try (var jsonWriter = jwf.createWriter(sw)) { jsonWriter.writeArray(jsonArray); System.out.println(sw); } } public static List<User> createUsers() { var born1 = LocalDate.of(1992, 3, 2); var u1 = new User("John Doe", "gardener", born1); var born2 = LocalDate.of(1967, 11, 22); var u2 = new User("Brian Flemming", "teacher", born2); var born3 = LocalDate.of(1995, 4, 7); var u3 = new User("Lucy Black", "accountant", born3); var born4 = LocalDate.of(1972, 8, 30); var u4 = new User("John Doe", "gardener", born4); return List.of(u1, u2, u3, u4); } }
用
createArrayBuilder()
创建一个JsonArrayBuilder
。var ab = Json.createArrayBuilder();
在此 for 循环中,我们创建 JSON 对象并将其添加到构建器中。
users.forEach(user -> { var ob = Json.createObjectBuilder(); ob.add("name", user.getName()); ob.add("occupation", user.getOccupation()); ob.add("born", user.getBorn().toString()); ab.add(ob); });
输出结果:
[ { "name": "John Doe", "occupation": "gardener", "born": "1992-03-02" }, { "name": "Brian Flemming", "occupation": "teacher", "born": "1967-11-22" }, { "name": "Lucy Black", "occupation": "accountant", "born": "1995-04-07" }, { "name": "John Doe", "occupation": "gardener", "born": "1972-08-30" } ]
-
JSON-P
JsonParser
JsonParser
使用请求解析编程模型解析 JSON。 在此模型中,客户端代码控制线程并在处理每个元素之后调用方法next()
将解析器前进到下一个状态。解析器生成以下事件之一:
START_OBJECT
,END_OBJECT
,START_ARRAY
,END_ARRAY
,KEY_NAME
,VALUE_STRING
,VALUE_NUMBER
,VALUE_TRUE
,VALUE_FALSE
和VALUE_NULL
。解析user.josn文件
[ { "name": "John Doe", "occupation": "gardener", "born": "1992-03-02" }, { "name": "Brian Flemming", "occupation": "teacher", "born": "1967-11-22" }, { "name": "Lucy Black", "occupation": "accountant", "born": "1995-04-07" }, { "name": "William Bean", "occupation": "pilot", "born": "1977-10-31" } ]
我们使用 JSON-P 流式 API 解析
users.json
文件。public class JsonParserSimpleEx { public static void main(String[] args) throws FileNotFoundException { var is = new FileInputStream("src/main/resources/users.json"); var factory = Json.createParserFactory(null); var parser = factory.createParser(is, StandardCharsets.UTF_8); if (!parser.hasNext() && parser.next() != JsonParser.Event.START_ARRAY) { return; } // looping over object attributes while (parser.hasNext()) { var event = parser.next(); // starting object if (event == JsonParser.Event.START_OBJECT) { while (parser.hasNext()) { event = parser.next(); if (event == JsonParser.Event.KEY_NAME) { var key = parser.getString(); switch (key) { case "name": parser.next(); System.out.printf("Name: %s%n", parser.getString()); break; case "occupation": parser.next(); System.out.printf("Occupation: %s%n", parser.getString()); break; case "born": parser.next(); System.out.printf("Born: %s%n%n", parser.getString()); break; } } } } } } }