728x90
반응형

이번에 XStream에 관련 해야할 일이 생겨 잠깐 학습을 하던 중 좋은 블로그를 발견했다.

(박성철 님의 생각하고 나누고 공감하기란 블로그-http://gyumee.egloos.com/1296932)

XStream 교재를 번역해서 올렸는데 덕분에 초반 학습을 잘 할 수 있었다.

아직 JSON 관련 부분은 번역본이 올라오지 않아 따로 공부하는 김에 올려볼까....생각만,

나는 영어도 잘 못하니까 그냥 영어 공부하는 데 더 큰 비중을 두며 번역한다.

원본 : http://xstream.codehaus.org/json-tutorial.html

 

 

JSON Tutorial

XStream은 유연한 구조를 가지기 때문에 XML 문서화시키는 것만큼 JSON과 매핑시키는 것도 쉽다. 이것을 모두 하는 것은 XStream 객체를 적절한 드라이버를 가지고 초기화 시키고 네가 너의 객체를 JSON으로 직렬화하기 위함이다.

 

XStream은 최근에 JSON을 위한 두 개의 드라이버를 전달받았다:  JsonHierarchicalStreamDriver 와 JettisonMappedXmlDriver.

첫번째는 추가적인 의존성을 가지지 않지만 xml을 쓰는것만 사용할 수 있다. 반면 두번째는 jeiitson에 기반을 두었고, 자바 객체를 다시 json으로 변환시키는 것 또한 가능하다. 하지만 JettisonMapperXmlDriver 가 분명한 XML을 JSON으로 변환하기 때문에 JsonHierachicalStreamDriver 를 가지고 하는 것이 네가 더 좋은 JSON strings을 가질 수 있을 것이다. 이 드라이버는 쓰여진 데이터의 타입에 대해 더 잘 알고 적절히 행동할 수 있기 때문에.

 

한 가지 주의사항!

JSON은 시스템과 언어 사이 데이터를 쉽게 변환하기 위해 만들어졌다. 이 말은 확실한 데이터 구조를 표현할 가능성을 더 적게 제공한다는 것이다. 이는 이름/값 한 쌍의 초기적인 데이터 타입, 배열, 리스트를 지원하고 그것들을 저장하는 것을 허락한다. 하지만 그거뿐이다. 참고할 수 없으며, 속성값과 같은 메타 데이터도 불가능 하며 같은 이름을 가진 프로퍼티도 안된다(내포된 콜렉션을 만들기 때문에).

그러므로 의문을 기대하지 마라. XStream(그리고 Jettison)은 최선을 다하지만 어떤 종류의 객체를 JSON으로 전환시키는 과정은 손실이 있는 변환이며 특히 어떤 구조를 직렬화시키는 것은 불가능하다. 또한 JSON의 제한된 FAQ를 보아라. 또한 자바 스크립트에 어떤 숫자 값을 적는 것은 64비트 더블 정확한 플롯 값이다. IEEE754 표준에 따른. 따라서 정확성에 대한 손실없이 모든 값을 자바의 long타입으로 변환하는 것은 불가능하다. json과 자바스크립트를 위한 FAQ를 다시 보아라.

 

JSON은 참조를 표현하는 것이 불가능하기 때문에 너는 JSON을 쓰면서 항상 NO_REFERENCES 모드로 설정해야 한다.

 

 

Jettison driver

Jettison 드라이버는 JSON포맷에서 데이터를 읽고 쓰기위해 StAX 파서를 사용한다. 이것은 버전 1.2.2부터 XStream을 가능하게 하고 이는 com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver 에서 표현되어졌다. 성공적으로 이 드라이버를 사용하기 위해 Jettison 프로젝트를 가져야하고 StAX API를 너의 classpath에 명시해야한다(optional dependencis를 참고하라)

 

그렇지 않으면 JAR파일들을 다운로드 할 수도 있다.

여기 간단한 몇 개의 예제가 있다.

 

Write to JSON with the Jettison-based implementation

package com.thoughtworks.xstream.json.test;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

public class WriteTest {

 public static void main(String[] args) {

        Product product = new Product("Banana", "123", 23.00);
        XStream xstream = new XStream(new JettisonMappedXmlDriver());
        xstream.setMode(XStream.NO_REFERENCES);
        xstream.alias("product", Product.class);

        System.out.println(xstream.toXML(product));  
  
 }

}

위의 예제를 JSON 문법에 따라 생성하면 아래와 같다.

{"product":{"name":"Banana","id":123,"price":23.0}}

또한 볼 수 있듯 모든 XStream의 표준 특징들은 이 드라이버를 가지고 사용할 수 있다.

 

Jettison은 숫자 값을 추적하려고 시도하고 따옴표(quotes)들은 무시한다. Jettison은 원래 데이터 타입에 대해선 알 수 없기 때문에 추측할 뿐이다. 이런 이유로 미래에 숫자값인 id 필드의 값을 쓴다

 

 

Write to JSON with the self-contained JSON driver

위의 예제와 초기화에 대한 부분(라인)만 다를 뿐이다.

XStream xstream = new XStream(new JsonHierarchicalStreamDriver());

출력값은 다음과 같다.

{"product": {
  "name": "Banana",
  "id": "123",
  "price": 23.0
}}

차이점이 명확하기 때문에 너는 id 요소에 대한 값에 대해 주의해야한다. 이 때 드라이버는 string값에 대해 알고 있기 때문에 quote가 생성되었다.

(price를 보면 숫자로 인식해서 "가 없는데 id는 string으로 인식해서 "가 생성되었다는 뜻인듯)

 

Write to JSON with the self-contained JSON driver dropping the root

때때로 JSON에 의해 생성되어 지는 root 노드는 필요치않다. 이것의 이름은 쓰여진 객체의 자바 타입에 따라 생기기 때문에 JSON에선 의미가 없고 오직 구조의 레벨만 올릴 뿐이다. 그러므로 내부적으로 다른 모드로 JsonWriter를 사용하여 초기화함으로써 이 root를 없앨수 있다. 다시 말해 위의 예제와 초기화 부분이 다른 이유는 이때문이다.

XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
    public HierarchicalStreamWriter createWriter(Writer writer) {
        return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
    }
});

이렇게 생성된 결과는 다음과 같다.

{
  "name": "Banana",
  "id": "123",
  "price": 23.0
}

만약 XStream이 JSON(string, int, URL과 같은)의 하나의 값을 가진 하나의 객체를 정리(?-marshal)한다면 유효하지않은 JSON을 생성할 수도 있다. JSON은 사실 하나의 객체를 root로 요구한다. 하지만 이 root를 없앰으로써 하나의 값만이 생성된다. 너는 이 경우에 ConversionException을 던져 JsonWriter를 강요할 수 있다. JsonWriter의 Javadoc을 보아라.

Read from JSON

아래 코드가 있다.

package com.thoughtworks.xstream.json.test;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

public class ReadTest {

 public static void main(String[] args) {
  String json = "{\"product\":{\"name\":\"Banana\",\"id\":123"
      + ",\"price\":23.0}}";
      
  XStream xstream = new XStream(new JettisonMappedXmlDriver());
  xstream.alias("product", Product.class);
  Product product = (Product)xstream.fromXML(json);
  System.out.println(product.getName());
 }

}

이를 JSON으로 직렬화시켜 이전 예제를 가지고 자바 객체로 생성하고 프린트하면 다음과 같다.

Banana
728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,