Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách áp dụng Java IO kết hợp với Jackson để xử lý việc đọc ghi file Json trong Java.
Maven Dependency
Để sử dụng Jackson trong Project Maven chúng ta cần thêm dependency sau:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>
Ở đây, mình sử dụng phiên bản 2.9.8, các bạn có thể sử dụng phiên bản mới hơn tại maven central.
Ghi file Json với OutputStream
Chúng ta có thể ghi file Json vào Outputstream bằng cách sử dụng JsonGenerator class. Trước tiên, chúng ta cần khởi tạo một JsonGenerator nhận OutputStream làm tham số đầu vào.
Trong ví dụ này thì chúng ta sẽ sử dụng ByteArrayOutputStream thừa kế OutputStream.
ByteArrayOutputStream stream = new ByteArrayOutputStream(); JsonFactory jfactory = new JsonFactory(); JsonGenerator jGenerator = jfactory .createGenerator(stream, JsonEncoding.UTF8);
Tiếp theo, giả sử chúng ta muốn ghi một file Json có cấu trúc như sau:
{ "name":"Tom", "age":25, "address":[ "Poland", "5th avenue" ] }
Chúng ta có thể sử dụng JsonGenerator để ghi các field vào OutputStream.
jGenerator.writeStartObject(); jGenerator.writeStringField("name", "Tom"); jGenerator.writeNumberField("age", 25); jGenerator.writeFieldName("address"); jGenerator.writeStartArray(); jGenerator.writeString("Poland"); jGenerator.writeString("5th avenue"); jGenerator.writeEndArray(); jGenerator.writeEndObject(); jGenerator.close();
Cuối cùng, chúng ta có thể chuyển OutputStream sang String để kiểm tra kết quả
String json = new String(stream.toByteArray(), "UTF-8"); System.out.println(json); // {"name":"Tom","age":25,"address":["Poland","5th avenue"]}
Convert Json sang JsonParser
Khi chúng ta nhận được Json String và chúng ta muốn trích xuất dữ liệu qua từng field thông qua JsonParser class có thể làm như sau:
String json = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}"; JsonFactory jfactory = new JsonFactory(); JsonParser jParser = jfactory.createParser(json);
Để trích dữ liệu Json chúng ta có thể sử dụng nextToken() để duyệt qua và lấy giá trị thông qua các method:
- getCurrentName(): Trả về tên của field trong Json.
- getText(): Lấy giá trị của một field dưới dạng string.
- getIntValue(): Lấy giá trị field dứoi dạng int.
public class Main { public static void main(String[] agrs) throws IOException { String json = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}"; JsonFactory jfactory = new JsonFactory(); JsonParser jParser = jfactory.createParser(json); String parsedName = null; Integer parsedAge = null; List<String> addresses = new LinkedList<>(); while (jParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jParser.getCurrentName(); if ("name".equals(fieldname)) { jParser.nextToken(); parsedName = jParser.getText(); } if ("age".equals(fieldname)) { jParser.nextToken(); parsedAge = jParser.getIntValue(); } if ("address".equals(fieldname)) { jParser.nextToken(); while (jParser.nextToken() != JsonToken.END_ARRAY) { addresses.add(jParser.getText()); } } } jParser.close(); System.out.println(parsedName); System.out.println(parsedAge); System.out.println(addresses); } }
Tóm lược
Như vậy là chúng ta đã biết cách ghi file Json thông qua cú pháp trong Java với JsonGenerator, và cách để object hoá một chuỗi với JsonParser.