JSON은 JavaScript Object Notation의 약자로 데이터를 저장하고 전송하기 위한 목적의 경량 데이터 교환 형식입니다.
이름에서 알 수 있듯이 원래는 Javascript에서 객체를 만들기 위한 표현식이였으며 현재는 언어에 관계 없이 데이터를 표시하기 위한 방법으로 사용됩니다.
자바는 JSON에 대한 퍼스트 클래스에 대한 지원이 없습니다.
버텍스 라이브러리는 JSON을 처리하기 위한 두 개의 클래스를 제공합니다.
이 문서는 JsonObject에 대해서 소개합니다.
JsonObject 생성
버텍스의 JsonObject 클래스는 JSON 객체를 구현합니다.
JSON 객체는 문자열 키가 있는 Map 자료구조이며 저장 할 수 있는 값은 JSON이 지원하는 데이터 타입입니다.
JsonObject 입력 키 | JsonObject 입력 값 |
비어 있는 JSON 객체를 생성하려면 JsonObject 생성자를 호출합니다.
JSON 객체 표현식을 따르는 문자열을 사용하여 JsonObject를 초기화 할 수도 있습니다.
JsonObject o1 = new JsonObject();
JsonObject o2 = new JsonObject("{\"foo\":\"bar\"}");
Map 자료구조를 사용하여 JsonObject를 초기화하려면 다음과 같이 사용합니다.
Map<String, Object> map = new HashMap<>();
map.put("foo", "bar");
map.put("xyz", 3);
JsonObject o = new JsonObject(map);
JsonObject 읽기/쓰기
JsonObject에 키/값(Entries)을 저장하려면 put() 메소드를 호출합니다.
JsonObject o = new JsonObject();
o.put("foo", "bar").put("num", 123).put("mybool", true);
JsonObject에는 Null 값을 명시적으로 저장 할 수 있습니다.
JsonObject o = new JsonObject();
o.putNull("foo");
JsonObject에 저장된 값을 읽어오려면 getXXX() 메소드를 호출합니다.
- public Object getValue()
- public String getString()
- public Number getNumber()
- public Integer getInteger()
- public Long getLong()
- public Float getFloat()
- public Double getDouble() 등
읽어오는 값의 데이터 유형에 맞는 메소드를 선택합니다.
String val = o.getString("some-key");
int intVal = o.getInteger("some-other-key");
JsonObject에 일치하는 키가 저장되어 있는지 확인하려면 containsKey() 메소드를 호출합니다.
키가 존재하면 true 키가 존재하지 않으면 false입니다.
JsonObject o = new JsonObject();
return o.containsKey("foo");
전체 키에 대한 Collection를 얻으려면 fieldNames() 메소드를 호출합니다.
JsonObject o = new JsonObject();
o.put("foo", "bar");
Set<String> keys = o.fieldNames();
JsonObject 키/값 삭제
JsonObject에 키/값을 삭제하려면 remove() 메소드를 호출합니다.
JsonObject o = new JsonObject();
Object removed = o.remove("foo");
삭제하려는 키가 존재하면 저장 값을 리턴하고, 키가 존재하지 않으면 Null을 리턴합니다.
키가 존재하더라도 값은 Nullable합니다.
객체에 저장된 모든 키/값을 삭제하려면 clear() 메소드를 호출합니다.
JsonObject o = new JsonObject();
o.put("foo", "bar");
o.clear();
JsonObject 사이즈
size()는 JsonObject 객체에 저장된 키의 수를 리턴합니다.
JsonObject o = new JsonObject();
// size is 0
System.out.println(o.size());
// size is 1
o.putNull("foo");
System.out.println(o.size());
JsonObject 객체가 완전히 비어있는 경우 size()는 0을 리턴합니다. size()가 0인 경우를 확인하려면 isEmpty() 메소드를 호출합니다.
JsonObject o = new JsonObject();
// isEmpty() is true
System.out.println(o.isEmpty());
// isEmpty() is false
o.putNull("foo");
System.out.println(o.isEmpty());
JsonObject를 문자열로 변환
JsonObject 객체를 문자열로 변환하려면 toString() encode() encodePrettily() 중 하나를 호출합니다.
toString()은 내부적으로 encode()를 호출하므로 차이가 없습니다.
encode()와 encodePrettily()는 변환되는 문자열이 사람이 읽기 좋은 형태인지에 대한 차이입니다.
// encode
{"123":123,"456":456}
// encode prettily
{
"123" : 123,
"456" : 456
}
encodePrettily()는 띄어쓰기(Space) 및 개행(\n)과 같은 공백을 포함하므로 데이터 전달을 위해서는 encode() 사용을 권장합니다.
JsonObject와 Java 객체 간 매핑
버텍스의 JsonObject는 Java 객체와 상호 매핑(Mapping) 할 수 있습니다.
다음 예제에서는 Java 객체를 사용하여 JsonObject 객체를 생성하고, JsonObject 객체를 사용하여 Java 객체를 생성하기도 합니다.
이때 JsonObject의 키/값은 Java 객체의 필드 이름/값과 매핑되며 mapTo() 또는 mapFrom() 메소드를 사용합니다.
request.bodyHandler(buff -> {
JsonObject jsonObject = buff.toJsonObject();
User javaObject = jsonObject.mapTo(User.class);
});
어느 방향이 되었든 매핑을 위해서 Jackson’s ObjectMapper#convertValue()를 사용합니다.
필드 및 생정자의 접근자, 직렬화(Serialization) 및 역직렬화(Deserialization)에 관한 주의 사항을 확인하려면 Jackson 도큐먼트를 참고합니다.
Java의 리플랙션(Reflection)에 비추어 보면 매핑되는 필드와 생성자는 당연히 Public 접근자가 지정되야 합니다.
생성자의 경우 코드에서 별도 정의하지 않았다면 디폴트 생성자는 Public입니다.
정리 및 복습
- 버텍스 라이브러리는 JSON 사용을 위해 JsonObject와 JsonArray를 제공합니다.
- JsonObject는 다음 기능을 제공합니다.
함수 | 비고 |
키와 값으로 이뤄진 정보를 저장합니다. | |
Null 값을 가진 키를 저장합니다. | |
키를 이용하여 값을 읽어옵니다. 읽어오려는 데이터 유형에 맞추어 함수를 호출해야 합니다. | |
키가 존재하는지 검사합니다. 값은 Nullable합니다. | |
키와 값을 삭제합니다. 키가 존재하면 삭제된 값을 리턴합니다. 리턴 값은 Nullable합니다. | |
모든 키와 값을 삭제합니다. | |
저장된 키의 수량을 리턴합니다. | |
키가 하나도 존재하지 않는지 검사합니다. | |
JSON 객체를 문자열로 변환합니다. encodePrettily는 공백을 포함하며 사람이 읽기 쉬운 형태로 변환합니다. | |
JSON 객체와 Java 객체 간에 상호 매핑합니다. 매핑 규칙은 Jackson 도큐먼트를 참고합니다. |
'Java > Vert.x' 카테고리의 다른 글
버텍스 코어: 컨텍스트(Context) (0) | 2022.02.01 |
---|---|
버텍스 코어: 버티클 배포 옵션(DeploymentOptions)을 사용한 환경 설정 배포 (0) | 2022.01.31 |
버텍스 코어: 배포 옵션(DeploymentOptions)을 사용하여 버티클 배포 인스턴스 확보 (0) | 2022.01.31 |
버텍스 코어: 버티클 팩토리(Verticle Factory) (0) | 2022.01.31 |
버텍스 코어: 버티클(Verticle) (0) | 2022.01.31 |