소개
이 랩에서는 Jackson ObjectMapper 클래스를 사용하여 객체를 JSON 으로, JSON 을 객체로 매핑하는 방법을 배웁니다. DemoClass라는 간단한 Java 클래스를 사용하고 JSON 데이터를 읽고 쓰는 다양한 기술을 익힐 것입니다.
이 랩에서는 Jackson ObjectMapper 클래스를 사용하여 객체를 JSON 으로, JSON 을 객체로 매핑하는 방법을 배웁니다. DemoClass라는 간단한 Java 클래스를 사용하고 JSON 데이터를 읽고 쓰는 다양한 기술을 익힐 것입니다.
~/project 디렉토리에 새 프로젝트를 생성하고 새로운 DemoClass Java 클래스를 만듭니다. 다음 코드를 DemoClass.java 코드 파일에 붙여넣습니다.
import java.util.Date;
public class DemoClass {
private String field1;
private Double field2;
private Date dateField;
// Constructors
DemoClass() {}
DemoClass(String field1, Double field2, Date dateField) {
this.field1 = field1;
this.field2 = field2;
this.dateField = dateField;
}
// getters and setters
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public Double getField2() {
return field2;
}
public void setField2(Double field2) {
this.field2 = field2;
}
public Date getDateField() {
return dateField;
}
public void setDateField(Date dateField) {
this.dateField = dateField;
}
}
다음 명령을 사용하여 DemoClass Java 클래스를 컴파일합니다.
javac DemoClass.java
ObjectMapper 클래스의 readValue() 메서드를 사용하여 JSON 파일에서 객체로 데이터를 읽을 수 있습니다. 우리의 JSON 파일은 단일 객체의 속성 - 값 쌍을 포함합니다.
demo.json이라는 새 파일을 만들고 다음 JSON 내용을 붙여넣습니다.
{
"field1": "Sample-1",
"field2": 20.21,
"dateField": "2021-07-30T14:20:30.000Z"
}
다음 코드를 사용하여 JSON 파일을 읽고 DemoClass 객체에 매핑합니다.
import java.io.File;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectMapperDemo {
public static void main(String[] args) {
try {
String filePath = "demo.json";
File file = new File(filePath);
ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DemoClass obj = objMapper.readValue(file, DemoClass.class);
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
} catch (Exception e) {
System.out.println(e);
}
}
}
출력 결과는 다음과 같습니다.
Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021
JSON 문자열에서 객체로 데이터를 읽을 수 있습니다. ObjectMapper 클래스의 readValue() 메서드를 사용할 것입니다. 또한 이 메서드에 클래스 타입 (class type) 을 전달해야 합니다.
JSON 문자열에서 데이터를 읽으려면 다음 코드를 추가하십시오.
String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";
ObjectMapper objMapper = new ObjectMapper();
DemoClass obj = objMapper.readValue(jsonString, DemoClass.class);
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
출력 결과는 다음과 같습니다.
Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021
URL 에서 객체를 읽는 것도 매우 간단합니다. readValue() 메서드에 URL 객체와 클래스 타입을 전달해야 합니다.
JSON URL 에서 객체를 읽고 매핑하려면 다음 코드를 추가하십시오.
import java.net.URL;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectMapperDemo {
public static void main(String[] args) {
try {
URL jsonFileUrl = new URL("file:demo.json");
ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DemoClass obj = objMapper.readValue(jsonFileUrl, DemoClass.class);
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
} catch (Exception e) {
System.out.println(e);
}
}
}
출력 결과는 2 단계와 동일합니다.
문자열에 JSON 형식으로 여러 객체 데이터 (배열) 가 포함되어 있다고 가정해 보겠습니다. ObjectMapper 클래스를 사용하여 이 모든 데이터를 DemoClass 타입의 배열로 읽을 수 있습니다.
JSON 문자열 배열에서 객체를 객체 배열로 읽으려면 다음 코드를 추가하십시오.
String jsonString = " [{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}," +
" {\"field1\":\"Sample-2\",\"field2\":22.55,\"dateField\":\"2021-07-31T14:20:30.000Z\"}]";
ObjectMapper objMapper = new ObjectMapper();
DemoClass[] objectArr = objMapper.readValue(jsonString, DemoClass[].class);
for (DemoClass obj : objectArr) {
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
System.out.println();
}
출력 결과는 다음과 같습니다.
Field1: Sample-1
Field2: 20.21
DateField: Fri Jul 30 14:20:30 UTC 2021
Field1: Sample-2
Field2: 22.55
DateField: Sat Jul 31 14:20:30 UTC 2021
고정 크기의 객체 배열로 데이터를 읽고 싶지 않다면 객체를 리스트로 읽을 수 있습니다.
JSON 문자열 배열에서 객체를 객체 리스트로 읽으려면 다음 코드를 추가하십시오.
String jsonString = " [{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}," +
" {\"field1\":\"Sample-2\",\"field2\":22.55,\"dateField\":\"2021-07-31T14:20:30.000Z\"}]";
ObjectMapper objMapper = new ObjectMapper();
ArrayList<DemoClass> objectList = objMapper.readValue(jsonString, new TypeReference<ArrayList<DemoClass>>(){});
for (DemoClass obj : objectList) {
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
System.out.println();
}
출력 결과는 5 단계와 동일합니다.
JSON 문자열에서 데이터를 맵 (map) 으로 읽을 수도 있습니다. 클래스의 각 속성은 키 (key) 가 되고, 속성 값은 값이 됩니다.
JSON 문자열 배열에서 데이터를 맵으로 읽으려면 다음 코드를 추가하십시오.
String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";
ObjectMapper objMapper = new ObjectMapper();
Map<String, Object> objectMap = objMapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {});
for (Map.Entry<String, Object> entry : objectMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
출력 결과는 다음과 같습니다.
field1: Sample-1
field2: 20.21
dateField: 2021-07-30T14:20:30.000Z
JsonNode 클래스는 JSON 을 파싱 (parsing) 하는 더 유연한 방법을 제공합니다. ObjectMapper 클래스의 readTree() 메서드를 사용하여 JSON 을 JsonNode 객체로 읽을 수 있습니다.
JSON 을 JsonNode 객체로 읽으려면 다음 코드를 추가하십시오.
String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"dateField\":\"2021-07-30T14:20:30.000Z\"}";
ObjectMapper objMapper = new ObjectMapper();
JsonNode node = objMapper.readTree(jsonString);
System.out.println("Field1: " + node.get("field1").asText());
System.out.println("Field2: " + node.get("field2").asDouble());
System.out.println("DateField: " + node.get("dateField").asText());
출력 결과는 2 단계와 동일합니다.
예상치 못한 입력 (input) 과 함께 작동하도록 ObjectMapper를 구성할 수 있습니다.
새로운 속성을 무시하도록 ObjectMapper를 구성하려면 다음 코드를 추가하십시오.
String jsonString = "{\"field1\":\"Sample-1\",\"field2\":20.21,\"field3\":\"Unknown\"}";
ObjectMapper objMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DemoClass obj = objMapper.readValue(jsonString, DemoClass.class);
System.out.println("Field1: " + obj.getField1());
System.out.println("Field2: " + obj.getField2());
System.out.println("DateField: " + obj.getDateField());
출력 결과는 2 단계와 동일합니다.
기본적으로 ObjectMapper는 java.util.date를 long 값으로 매핑합니다. 이 long 값은 1970 년 1 월 1 일 이후 경과된 밀리초 (milliseconds) 수를 나타냅니다.
java.util.date를 직렬화 (serialize) 하기 위해 SimpleDateFormat을 사용하여 날짜 형식을 정의하는 방법을 보여주기 위해 다음 코드를 추가하십시오.
ObjectMapper objMapper = new ObjectMapper();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
objMapper.setDateFormat(dateFormat);
DemoClass obj = new DemoClass("Sample-1", 20.21, new Date());
String jsonString = objMapper.writeValueAsString(obj);
System.out.println(jsonString);
출력 결과는 다음과 같습니다.
{"field1":"Sample-1","field2":20.21,"dateField":"30-07-2021"}
이 랩 (lab) 에서는 Jackson ObjectMapper 클래스를 사용하여 객체를 JSON 으로, JSON 을 객체로 매핑하는 방법을 배웠습니다. JSON 파일을 객체로 읽어들이고, JSON 문자열에서 데이터를 읽어 객체로 매핑하며, JSON 문자열 배열에서 객체 목록 또는 배열로 객체를 읽는 방법을 배웠습니다. 또한 JSON 문자열을 JsonNode 객체로 읽고, 새로운 속성 또는 기본 유형의 null 값을 무시하도록 ObjectMapper를 구성하는 방법도 배웠습니다. 마지막으로, 날짜를 처리하고 java.util.date를 직렬화하는 동안 특정 날짜 형식을 사용하는 방법을 배웠습니다.