일반인의 관점에서 보면 Jackson은 JSON 형식의 데이터를 처리하는 데 사용되는 Java 클래스 라이브러리이며 성능이 매우 좋습니다. 이 기사에서는 Jackson의 사용법에 대한 보다 자세한 예제 분석을 제공합니다. 세부사항은 다음과 같습니다:
1. 소개
Jackson은 직렬화 및 역직렬화 효율성이 상대적으로 높은 것으로 나타났습니다. 변환 형식에 관계없이 Jackson > Gson > Json-lib이며 Jackson의 처리 능력은 Json-lib보다 거의 10배 높으며, 성별도 맞습니다. 매우 높습니다. 이에 비해 Json-lib는 업데이트가 중단된 것으로 보이며, 최신 버전 역시 JDK15를 기반으로 하고 있는 반면, 잭슨 커뮤니티는 더욱 활성화되어 있습니다.
아래에서는 잭슨의 사용법을 예시와 함께 간략하게 소개하겠습니다.
2. 사용
Jackson은 많은 클래스와 메서드를 제공하며 직렬화 및 역직렬화에서 가장 일반적으로 사용되는 클래스는 Json-lib의 JsonObject 및 ArrayObject와 유사한 ObjectMapper 클래스입니다. 이 클래스는 변환을 위한 readTree(), readValue(), writeValueAsString()과 같은 메소드를 제공합니다. 이 클래스에 대한 구체적인 문서 주소는 http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html입니다.
중복되는 설명을 피하기 위해 아래에 언급된 objectMapper는 모두 ObjectMapper objectMapper = new ObjectMapper()에서 따왔습니다. 아래에서는 직렬화(Serialization)와 역직렬화(Deserialization) 측면에서 사용법을 간략하게 소개하겠습니다.
1. 직렬화
① Java 자체 클래스 직렬화
테스트 예시
목록 목록=new ArrayList();list.add(1);list.add(2);list.add(3);
직렬화 구현:
문자열 teststringlist=objectMapper.writeValueAsString(list);System.out.println(teststringlist);
콘솔의 결과 출력은 다음과 같습니다.
[1,2,3]
결론적으로:
Jackson은 일반 유형의 직렬화를 쉽게 구현할 수 있습니다.
②커스텀 클래스 직렬화
테스트 예:
공개 클래스 학생 {private int age=10;private String name="hhh"; public String[] list={"hao","haouhao","keyi"} public Date time=new Date(); () { 나이 반환; } 공개 void setAge(int 나이) { this.age = 나이; } 공개 문자열 getName() { 반환 이름 } 공개 void setName(문자열 이름); }}
예제를 보다 일반적으로 만들기 위해 이 클래스에는 값 유형 int, 참조 유형 String, String[] 및 날짜 유형 Date가 포함됩니다.
직렬화 구현
학생 st=새 학생();String teststringstu=objectMapper.writeValueAsString(st);System.out.println(teststringstu);
콘솔의 결과 출력은 다음과 같습니다.
{"목록":["hao","haouhao","keyi"],"시간":1375429228382,"이름":"hhh","age":10}
결론적으로:
출력을 통해 변환된 Json 문자열이 형식을 준수하는 것을 확인할 수 있습니다. 다만 시간 표현이 좀 표준적이지 않네요. 시간 형식에 대한 수정 사항은 아래에 소개됩니다.
③시간 형식의 정의
Jackson에는 타임스탬프 형식의 자체 기본 시간 형식이 있으며 그 효과는 위 결과에 표시된 것과 같습니다(예: 1375429228382). 이 형식을 유효하지 않게 설정하려면 다음을 통과하세요.
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false)
시간 생성이 소위 [ISO-8601 ] 호환 표기법을 사용하여 "1970-01-01T00:00:00.000+0000" 형식과 유사한 시간을 출력하도록 설정할 수 있습니다.
물론 출력 시간 형식을 사용자 정의할 수도 있습니다.
사용자 정의 시간 형식 구현
이 예제에서는 위에 소개된 학생 클래스도 사용합니다.
학생 st=새 학생();java.text.DateFormat myFormat = 새 java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");objectMapper.getSerializationConfig().setDateFormat(myFormat);String teststringstu= objectMapper.writeValueAsString(st);System.out.println(teststringstu);
콘솔의 단점 출력은 다음과 같습니다.
{"목록":["hao","haouhao","keyi"],"시간":"2013-08-02 03:48:20","이름":"hhh","age":10}
결론적으로:
시간 출력 형식이 우리가 원하는 대로 된 것을 볼 수 있습니다. Jackson에서 시간 출력 형식을 정의하는 방법은 Json-lib에서 시간 형식을 정의하는 것보다 훨씬 간단합니다.
④ 또 다른 직렬화 방법
직렬화 구현
사용된 예는 여전히 이전 학생 수업입니다.
학생 st=새 학생();JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);jsonGenerator.writeObject(st);
콘솔의 출력은 다음과 같습니다.
{"목록":["hao","haouhao","keyi"],"시간":1375429228382,"이름":"hhh","age":10}
결론적으로:
이 메서드는 위 메서드의 값을 얻을 수도 있습니다. 하지만 이 메서드에서 이 함수에 주의하세요. createJsonGenerator()에는 두 개의 매개 변수가 필요합니다. 하나는 OutputStream 유형 매개 변수이고 다른 하나는 JsonEncoding 유형 매개 변수입니다. 이 두 매개변수를 통해 우리는 이 방법이 Json을 네트워크 스트림에 직접 쓸 수 있을 뿐만 아니라 Json을 파일 스트림이나 메모리 스트림에 쓸 수도 있다는 것을 이해할 수 있습니다. 그래서 더 다재다능합니다.
2. 역직렬화
①일회성 역직렬화
이 방법은 주로 ObjectMapper에서 제공하는 <testJsonClass> readValue(String content, Class<testJsonClass> valueType) 방법을 사용합니다. 이 메소드는 Json 문자열과 채워야 하는 클래스의 해당 Class를 입력해야 하며, 채워진 클래스를 반환합니다.
Json 문자열을 사용자 정의 클래스로 구문 분석합니다.
Json 문자열이 다음과 같은 경우:
문자열 test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"
시간.
먼저 클래스를 정의합니다.
공개 클래스 testJsonClass { 공개 int objectID; 공개 목록 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 문자열이 시스템 자체 클래스로 역직렬화됩니다.
문자열 JSON = "{"오류":0,"데이터":{"이름":"ABC","나이":20,"전화":{"집":"abc","모바일":"def"}," 친구":[{"이름":"DEF","전화" :{"home":"hij","mobile":"klm"}},{"name":"GHI","phone":{"home":"nop","mobile":"qrs"} }]},"기타":{"별명":[]}}".
시스템 자체 맵인 Map<String, Map<String, Object>> 맵을 사용하여 변수를 정의합니다. 그런 다음 map = objectMapper.readValue(json, Map.class)를 사용하여 Json을 변수 맵으로 역직렬화합니다.
통과하다
System.out.println(maps.get("error"));System.out.println((Object)(maps.get("data").get("phone")))
콘솔에서 다음 결과를 얻을 수 있습니다.
0{집=abc, 모바일=def}
②점진적 역직렬화
이 방법은 보다 유연하며 사용자가 관심 있는 Json 문자열 정보 값만 추출할 수 있습니다. 주로 ObjectMapper에서 제공하는 readTree와 Jackson에서 제공하는 JsonNode 클래스를 사용하여 구현됩니다.
테스트 예시
끈 test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.915039 0625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
이 Json 문자열은 중첩 배열 형식을 포함하여 비교적 복잡하며 보편적입니다.
역직렬화 구현
JsonNode node= objectMapper.readTree(test); //Json 문자열을 트리 구조의 메모리로 읽습니다. JsonNodecontents=node.get("results");//결과 노드 아래의 정보 가져오기 for(int i=0 ; i<contents.size();i++) //결과 아래의 정보를 탐색합니다. 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());}}
콘솔의 출력은 다음과 같습니다.
357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625
결론적으로:
이 방법은 XML 파싱의 DOM 파싱과 유사하며, 구조가 상세하여 원하는 정보를 쉽게 추출할 수 있다는 장점이 있습니다. 물론 단점은 이 방법과 동일하다. 시간과 공간이 필요하다.
3. 요약
Json에 대한 Jackson의 작업은 주로 위에 표시된 것과 같습니다. 해당 방법은 사용이 매우 편리하고 요청 시 정보를 읽을 수 있는 작업을 제공합니다. 그리고 Jackson은 Annotation 기능, Hibernate를 위한 지연 주입 기능, 시간 형식 설정 기능 등 다양한 세부 사항에서 직렬화 및 역직렬화를 제어할 수 있는 모든 기능을 갖추고 있으므로 이러한 기능을 주의 깊게 살펴보세요. 나중에. 동시에 Jackson은 XML에 대한 일련의 직렬화 및 역직렬화 작업도 지원합니다. 이 아이디어는 Json을 구문 분석하는 것과 거의 같습니다.
현재 Jackson의 단점과 관련하여 인터넷의 일부 사람들은 Json-lib보다 더 많은 메모리를 차지한다고 테스트했습니다. 시간을 위해 공간을 사용하는 것은 일반적으로 그만한 가치가 있습니다.