본문 바로가기

Java/Vert.x

버텍스 코어: JSON 사용을 위한 JsonObject

이 문서의 내용

    더보기

    JSON은 JavaScript Object Notation의 약자로 데이터를 저장하고 전송하기 위한 목적의 경량 데이터 교환 형식입니다.

    이름에서 알 수 있듯이 원래는 Javascript에서 객체를 만들기 위한 표현식이였으며 현재는 언어에 관계 없이 데이터를 표시하기 위한 방법으로 사용됩니다.

    자바는 JSON에 대한 퍼스트 클래스에 대한 지원이 없습니다.

    버텍스 라이브러리는 JSON을 처리하기 위한 두 개의 클래스를 제공합니다.

    이 문서는 JsonObject에 대해서 소개합니다.

    JsonObject 생성

    버텍스의 JsonObject 클래스는 JSON 객체를 구현합니다.

    JSON 객체는 문자열 키가 있는 Map 자료구조이며 저장 할 수 있는 값은 JSON이 지원하는 데이터 타입입니다.

    JsonObject 입력 키 JsonObject 입력 값
    String String Number Boolean Null

    비어 있는 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");
    더보기
    containsKey()의 결과가 true이더라도 값은 Nullable합니다.

    전체 키에 대한 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 사용을 위해 JsonObjectJsonArray를 제공합니다.
    • JsonObject는 다음 기능을 제공합니다.
    함수 비고
    put 키와 값으로 이뤄진 정보를 저장합니다.
    putNull Null 값을 가진 키를 저장합니다.
    getXXX 키를 이용하여 값을 읽어옵니다. 읽어오려는 데이터 유형에 맞추어 함수를 호출해야 합니다.
    containsKey 키가 존재하는지 검사합니다. 값은 Nullable합니다.
    remove 키와 값을 삭제합니다. 키가 존재하면 삭제된 값을 리턴합니다. 리턴 값은 Nullable합니다.
    clear 모든 키와 값을 삭제합니다.
    size 저장된 키의 수량을 리턴합니다.
    isEmpty 키가 하나도 존재하지 않는지 검사합니다.
    toString encode encodePrettily JSON 객체를 문자열로 변환합니다. encodePrettily는 공백을 포함하며 사람이 읽기 쉬운 형태로 변환합니다.
    mapTo mapFrom JSON 객체와 Java 객체 간에 상호 매핑합니다. 매핑 규칙은 Jackson 도큐먼트를 참고합니다.