빠른 시작 잭슨을 사용하는 간단한

 

1 소개

잭슨 변환의 형태로하거나, 시험에 따른 비교적 높은 직렬화 및 역 직렬화 효율 잭슨> GSON> JSON-LIB, 거의 10 배 JSON-LIB 잭슨 더 높은 처리 능력과 정확한 그것은 또한 매우 높다. 반면, JSON-lib 디렉토리 잭슨 커뮤니티가 더 활성화되어있는 동안 최신 버전은 또한, JDK15을 기반으로, 갱신을 중지 한 것으로 보인다.

이제 예제와 함께 잭슨의 사용에 대한 소개를 브리핑합니다.

2 사용

잭슨은 많은 클래스와 메소드를 제공하지만, 직렬화 및 역 직렬화의 클래스의 대부분은 JSON-lib 디렉토리와 된 JSONObject ArrayObject 더 유사하다이 클래스, ObjectMapper입니다. 그런은 readTree ()을 readValue () 제공 writeValueAsString () 등을 변환.
중복 설명을 피하기 위해, 아래 objectMapper은 ObjectMapper objectMapper = 새로운 ObjectMapper ()에 관하여 관여한다. 다음은 직렬화했고, 두 가지 측면을 간단한 사용을 직렬화.

2.1 직렬화
2.1.1 자바 클래스 고유 시퀀스
시험 예를 2.1.1.1

List list=new ArrayList();
list.add(1); list.add(2); list.add(3); 

2.1.1.2 직렬화 달성

 String teststringlist=objectMapper.writeValueAsString(list);
 System.out.println(teststringlist);

결과는 콘솔에 출력됩니다 :

[1,2,3]

2.1.1.3 결론
일반적인 유형의 잭슨 직렬화는 간단하고 달성 할 수있다.

2.1.2 사용자 정의 직렬화 클래스
2.1.2.1 시험 예

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 타입, 참조 형식 문자열 문자열 []의 값을 포함한다.

2.1.2.2 직렬화 달성

student st=new student();
String teststringstu=objectMapper.writeValueAsString(st);
System.out.println(teststringstu);

결과는 콘솔에 출력됩니다 :

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

2.1.2.3 결론
JSON 문자열이 출력에 의해 변환 된 표시 라인 형식이다. 그러나, 시간이 일부 기준을 충족하지 않는 표현. 다음은 시간의 형식에 대한 변경 사항을 설명합니다.

2.1.3 포맷 정의 된 시간
잭슨 타임 스탬프의 형태로, 즉 기본 시간 형식, 즉 위 효과 결과 (예 : 1,375,429,228,382)이있다. 설정하려는 경우이 형식은 시간이 소위 시간 호환 표기법을 사용하여 다음과 같은 형식과 유사한 출력 [ISO-8601]을 생성 할 수 있도록 objectMapper.configure (거짓 SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS)에 의해 제공 될 수있다, 무효 : "1970-01-01T00 : 00 : 00.000 + 0000 ".

물론, 당신은 또한 시간 출력 형식에서 정의 할 수 있습니다.

2.1.3.1 사용자 정의 구현 시간 형식의
예는 상기 한 학생 클래스를 사용하여.

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} 

2.1.3.2 결론
볼 시간 출력 형식은 우리가 원하는 것을하게되었다. JSON-lib 디렉토리의 형식에 정의 된 규정 시간보다 간단 잭슨 주차장에서 출력 형식의 방법.

2.1.4 또 다른 시퀀스 방법
2.1.4.1 직렬화 구현
사용 예는 학생 수업 전에 아직도있다.

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} 

2.1.4.2 결론
또한이 방법은 상기 방법의 값을 얻을 수있다. 이 방법이 있지만, 그 기능에 참고 createJsonGenerator를 ()는 파라미터 타입 JsonEncoding이며, 두 개의 매개 변수, 파라미터의 OutputStream 형 걸린다. 이 두 가지 매개 변수와 함께, 우리는 또한 JSON 파일 또는 메모리 스트림 흐름에 기록 할 수 있으며,이 방법 만 JSON 네트워크 스트림에 직접 기록 할 수 있음을 이해할 수있다. 그래서 더 다양한.

2.2 직렬화
2.2.1 일회용 직렬화
이 방법이 주로 제공 ObjectMapper <testJsonClass> readValue (문자열 콘텐츠 사용 클래스 <testJsonClass> 치형) 방법. 이 메소드는 클래스 JSON 문자열을 작성하고, 클래스에 대응해야하는 입력을 요구하는 클래스를 작성 후 리턴.

2.2.1.1 사용자 클래스에 JSON 열 해석
JSON 문자열이다
때 문자열 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.geoPoints) 수 콘솔의 출력값]에서 System.out.println (testClass.objectID를) 이용

357

[{X는 = 504604.59802246094는, Y는 = 305569.9150390625를}]

json으로 문자열을 역 직렬화하는 시스템이 클래스에 오는 2.2.1.2
문자열이 JSON 때

문자열 JSON = "{"오류 ": 0,"데이터 ": {"이름 ":"ABC ","나이 ": 20,"전화 ": {"집 ":"ABC ","모바일 ":"DEF " }, "친구": [{ "이름": "DEF", "전화": { "집": "HIJ", "모바일": "KLM"}}, { "이름": "GHI", "전화 ": {"집 ":"NOP ","모바일 ":"QRS "}}]},"기타 ": {"별명 ": []}}".

이 시스템은 가변지도의 정의와 함께 제공 :지도 <문자열,지도 <문자열, 객체 >>지도. 그런지도를 사용 = objectMapper.readValue (JSON, Map.class)는 가변 JSON으로지도를 탈 직렬화 할 수있다.

에서 System.out.println (maps.get ( "오류"))에 의해;에서 System.out.println (. (Object)을 (maps.get ( "데이터") ( "전화")) 취득), 콘솔에서 구할 수있다 다음과 같은 결과 :

0

{집 = abc 방송, 모바일 = DEF}

2.2.2 서서히 직렬화
이 방법은 더 유연 JSON 문자열 정보 값만을 추출하고, 사용자가 관심을 가질 수있다. 주요 사용 JsonNode 클래스를 달성하기 위해 ObjectMapper는 readTree 잭슨이 제공 제공.

2.2.2.1测试例子
문자열 테스트 = "{"결과 "[{"objectID에 "357"geoPoints ": [{"X "504604.59802246094,"Y "305569.9150390625}]}, {"objectID에 "358 "geoPoints": [{ "X"504602.2680053711, "Y"305554.43603515625}]}]} ";

이 문자열 JSON 복잡한 형태의 중첩, 범용의 어레이를 포함한다.

2.2.2.2 실현의 직렬화

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

2.2.2.3 매듭 *
이 방법의 장점은 원하는 정보를 추출하기 쉽고 상세한 구조이며, DOM을 XML 구문 분석 구문 분석과 유사하다. 물론,이 방법의 단점과 같은 : 시간이 많이 소요되는 공간.

3. 요약

위의 주요 JSON에 대하여 잭슨 동작은 상기 방법을 수행 한 번 동작을 제공하는 사용이 매우 편리하고,뿐만 아니라, 매우 유연하지만, 또한 요구 동작에 관한 정보를 판독 할 수 있습니다. 이러한 기능은 현재 매우주의 깊게 연구 덜 바람직하다 때문에 잭슨의 기능이 완료되면이 같은 주석 같은 직렬화의 세부 사항 및 해제 직렬화의 다양한 제어하고 지연 기능을 주입 최대 절전 모드 및 시간 형식 기능을 설정할 수 있습니다 나중에까지. 동시에, 잭슨도 거의 같은 생각입니다 직렬화 및 XML의 직렬화 복원의 범위를 지원하고 JSON을 해결.

잭슨 현재의 단점 들어, 인터넷은 전체 메모리의 일부를 JSON은 lib 디렉토리보다 더 많은 테스트를했다. 그리고 시간 공간의 사용은, 그것은 일반적으로 가치가있다.

역사 기사 :
JAVA 마이크로 채널 기업이 지불을 변경 (십분이 얻을)

원래 링크 (내 블로그 마이그레이션)  https://blog.csdn.net/angryjiji/article/details/98265414

추천

출처www.cnblogs.com/angryjj/p/11291981.html