잭슨의 용법 실례 분석

통속적으로 말하자면 잭슨은 JSON 형식의 데이터를 처리하는 자바의 라이브러리로 그 성능이 매우 좋다.본고는 잭슨의 용법에 대해 비교적 상세한 실례 분석을 하고자 한다.구체적으로 다음과 같습니다.
1. 소개
잭슨은 비교적 높은 서열화와 반서열화 효율을 가지고 있다. 테스트에 따르면 어떤 형식의 전환이든 잭슨>Gson>Json-lib, 그리고 잭슨의 처리 능력은 심지어 Json-lib보다 10배 가까이 높고 정확성도 매우 높다.이에 비해 제이슨 립은 업데이트를 중단한 것 같고 최신 버전도 JDK15를 기반으로 하고 잭슨의 커뮤니티는 활발하다.
다음은 잭슨의 용법에 대해 실례를 결합해 간단하게 소개한다.
2. 사용
잭슨은 많은 종류와 방법을 제공했는데 서열화와 반서열화에서 가장 많이 사용되는 종류는 Object Mapper이다. 이런 종류는 Json-lib에서 Json Object와 Array Object와 유사하다.변환에 사용할 readTree (), readValue (), writeValueAssString () 등의 방법이 있습니다.구체적인 설명 문서 주소는 다음과 같습니다.http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html.
중복된 설명을 피하기 위해 아래에 언급된objectMapper는 모두 ObjectMapper objectMapper = new ObjectMapper () 에 대한 것입니다.다음은 서열화와 반서열화 두 방면에 따라 용법을 간단하게 소개할 것이다.
1. 서열화
① 자바 자체 클래스에 대한 서열화
테스트 예

List list=new ArrayList();
list.add(1);
list.add(2);
list.add(3);
정렬화:

String teststringlist=objectMapper.writeValueAsString(list);
System.out.println(teststringlist);
콘솔에서 출력한 결과는 다음과 같습니다.

[1,2,3]
결론:
잭슨의 일반적인 유형에 대한 서열화는 간단하게 실현될 수 있다.
② 사용자 정의 클래스에 대한 서열화
테스트 예:

public class student {
private int age=10;
private String name="hhh"; 
  public String[] list={"hao","haouhao","keyi"};
  public Date time=new Date();
     public int getAge() {
          return age;
     }
     public void setAge(int age) {
          this.age = age;
     }
     public String getName() {
          return name;
     }
     public void setName(String name) {
          this.name = name;
     }
}
예를 더욱 유니버설하게 하기 위해 이 종류에는 값 형식 int, 인용 형식 String, String[], 날짜 형식 Date가 포함되어 있습니다.
서열화를 실현하다

student st=new student();
String teststringstu=objectMapper.writeValueAsString(st);
System.out.println(teststringstu);
콘솔에서 출력한 결과는 다음과 같습니다.

{"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}
결론:
출력을 통해 변환된 Json 문자열이 형식에 부합됨을 알 수 있습니다.하지만 시간 표시는 기준에 맞지 않는다.다음은 시간 형식에 대한 수정을 소개할 것이다.
③ 시간 형식에 대한 정의
잭슨은 자신의 기본 시간 형식, 즉timestamps 형식을 가지고 그 효과는 상기 결과에 나타난 것과 같다(예를 들어 1375429228382).이 형식을 설정하려는 경우

objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false)
이렇게 하면 시간을 이른바 사용 [ISO-8601]-compliant notation으로 생성하고 다음과 같은 형식의 시간을 출력할 수 있습니다. "1970-01-01T00:00:00:00.000+0000".
물론 출력의 시간 형식을 사용자 정의할 수도 있다.
사용자 정의 시간 형식의 실현
예는 위에서 소개한 학생 클래스도 채택한다.

student st=new student();
java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
objectMapper.getSerializationConfig().setDateFormat(myFormat);
String teststringstu=objectMapper.writeValueAsString(st);
System.out.println(teststringstu);
콘솔에서 출력된 기록은 다음과 같습니다.

{"list":["hao","haouhao","keyi"],"time":"2013-08-02 03:48:20","name":"hhh","age":10}
결론:
시간 출력 형식이 우리가 원하는 것으로 바뀌었다는 것을 알 수 있다.잭슨에서 시간 출력 형식을 정의하는 방법은 Json-lib에서 시간 형식에 대한 정의보다 훨씬 간편하다.
④ 또 다른 서열화 방법
서열화를 실현하다
사용한 예는 여전히 이전의 학생 클래스이다.

student st=new student();
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
jsonGenerator.writeObject(st); 
System.out.println();
콘솔의 출력 결과는 다음과 같습니다.

{"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}

결론:
이 방법 역시 상기 방법의 값을 얻을 수 있다.그러나 이 방법의 이 함수를 주의하십시오:createJsonGenerator (). 두 개의 매개 변수가 필요합니다. 하나는 OutputStream 형식의 매개 변수이고, 하나는 JsonEncoding 형식의 매개 변수입니다.이 두 가지 매개 변수를 통해 우리는 이 방법은 Json을 네트워크 흐름에 직접 쓸 수 있을 뿐만 아니라 Json을 파일 흐름이나 메모리 흐름에도 쓸 수 있다는 것을 알 수 있다.그래서 용도가 더 넓어요.
2. 반서열화
① 일회성 반서열화
이 방법은 주로 ObjectMapper에서 제공하는 readValue(String content, Classvalue Type) 방법을 이용한다.이 방법은 Json 문자열과 채워야 할 클래스의 Class를 입력하여 채워진 클래스로 되돌려야 합니다.
사용자 정의 클래스에 Json 문자열 분석
Json 문자열:

String test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"
그때
먼저 클래스를 사용자 정의합니다.

public class testJsonClass
 {
    public int objectID;
    public List geoPoints=new ArrayList();
}
그런 다음 다음 다음 다음 세그먼트 코드를 사용하여 Json을 다음과 같이 순서대로 정렬합니다.

testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);
활용단어참조

System.out.println(testClass.objectID);
System.out.println(testClass.geoPoints)
콘솔에서 출력할 수 있는 값은 다음과 같습니다.

357
[{x=504604.59802246094, y=305569.9150390625}]
시스템 자체 클래스에 Json 직렬을 반서열화
제이슨 꼬치로.

String json = "{"error":0,"data":{"name":"ABC","age":20,"phone":{"home":"abc","mobile":"def"},"friends":[{"name":"DEF","phone":{"home":"hij","mobile":"klm"}},{"name":"GHI","phone":{"home":"nop","mobile":"qrs"}}]},"other":{"nickname":[]}}"。
시스템이 자체적으로 가지고 있는 맵으로 변수를 정의합니다:Map>maps.그리고maps=objectMapper를 이용한다.readValue(json, Map.class)는 Json을 변수 맵에 반서열화할 수 있습니다.
통과

System.out.println(maps.get("error"));
System.out.println((Object)(maps.get("data").get("phone")))
콘솔에서 다음 결과를 얻을 수 있습니다.

0
{home=abc, mobile=def}
② 점진적 반서열화
이 방법은 더욱 유연하여 사용자가 흥미를 느끼는 Json 직렬 정보 값만 추출할 수 있다.주로 Object Mapper가 제공하는readTree와 잭슨이 제공하는 Json Node 클래스를 이용하여 실현한다.
테스트 예

String test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
이 Json 문자열은 비교적 복잡하고 삽입된 수조의 형식을 포함하며 통용성을 가지고 있다.
반서열화를 실현하다

JsonNode node= objectMapper.readTree(test);   // Json 
JsonNode contents=node.get("results");// results 
for(int i=0;i<contents.size();i++) // results ,size() , 
{
System.out.println(contents.get(i).get("objectID").getIntValue()); // 
JsonNode geoNumber=contents.get(i).get("geoPoints");
for(int j=0;j<geoNumber.size();j++)   // 
{
System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" "+geoNumber.get(j).get("y").getDoubleValue());
}
}

콘솔 아래에서 출력한 결과는 다음과 같습니다.

357
504604.59802246094 305569.9150390625
358
504602.2680053711 305554.43603515625

결론:
이 방법은 XML 해석에서의 DOM 방식 해석과 유사하며, 구조 내역이 있어 원하는 정보를 쉽게 추출할 수 있다는 장점이 있다.물론 그 단점도 이 방법과 같다. 시간 소모와 공간 소모다.
셋.총결산
잭슨의 제이슨에 대한 조작은 주로 위에서 보듯이 그 방법은 사용하기에 매우 편리하고 유연하다. 즉, 한꺼번에 완성된 조작을 제공하고 필요에 따라 정보를 읽을 수 있는 조작을 제공한다.또한 잭슨의 기능은 매우 완비되어 있어 서열화와 반서열화에 대해 다양한 세부적인 제어를 할 수 있다. 예를 들어 주해 기능과 Hibernate에 대한 지연 주입 기능, 시간 포맷 설정 기능 등이다. 이런 기능은 현재 필요하지 않기 때문에 앞으로 자세히 연구해야 한다.이 동시에 잭슨은 XML에 대한 일련의 서열화와 반서열화 조작을 지원하는데 그 사고방식은 Json을 해석하는 것과 대체적으로 같다.
잭슨의 현재 단점에 대해 인터넷에서 Json-lib보다 메모리를 더 많이 차지하는 테스트가 있다.공간을 이용하여 시간을 바꾸는 것은 일반적으로 가치가 있다.

좋은 웹페이지 즐겨찾기