잭슨의 용법 실례 분석
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에서 제공하는
사용자 정의 클래스에 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통과
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보다 메모리를 더 많이 차지하는 테스트가 있다.공간을 이용하여 시간을 바꾸는 것은 일반적으로 가치가 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
초보자가 Kotlin + Spring Boot의 Get 요청에서 JSON을 반환하기 위해 한 일업무로 서버측을 하게 되었으므로 그 연습을 위해 했던 일을 정리했습니다. 서버의 경험은 한순간 밖에 없습니다 🥺🥺🥺 (Java의 입문서를 해낸 정도... 먼저 @getMapping에서 String을 반환하는 방법은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.