잭슨 대 Gson [닫힘]


363

JSON에 대한 기존 라이브러리를 검색 한 후 마침내이 두 가지로 끝났습니다.

  • 잭슨
  • 구글 GSon

나는 GSON에 대해 약간 부분적이지만, 순전히 GSon은 특정 천상의 성능 문제 (2009 년 9 월 현재)로 고통 받고 있다는 것 입니다.

비교를 계속하고 있습니다. 그 사이에, 나는 내 마음을 구성하는 데 도움을 찾고 있습니다.


3
: 또한, 안드로이드 사용을 위해, 내가 본 최신 성능 벤치 마크는 이것이다 martinadamek.com/2011/02/04/...은
StaxMan


7
빠른 참고 사항 : GSon을 선택하는 사람은 2.1을 사용해야합니다. 성능은 이전 버전보다 훨씬 뛰어납니다.
StaxMan

46
현재 74 개의 상향식 투표를 통해이 질문에는 분명히 유용한 답변이 있습니다. 좋은 답변은 "건설적이지 않은"질문보다 우선합니다. 재개 투표.
Nicholas

1
Jackson의 문서는 지금 엄청나게 복잡해지고 있습니다. . .
dongshengcn

답변:


117

나는 지난주 에이 연구를했고 같은 2 개의 도서관으로 끝났습니다. Spring 3 (기본 Json보기 ' JacksonJsonView ' 에서 Jackson을 채택 함 )을 사용함에 따라 동일한 작업을 수행하는 것이 더 자연 스럽습니다. 2 lib는 거의 동일합니다 ... 결국 그들은 단순히 json 파일에 매핑됩니다! :)

어쨌든 잭슨 은 성능이 +이고 매우 중요합니다. 웹 페이지 에서 볼 수 있듯이 프로젝트도 매우 활발하며 이는 매우 좋은 신호입니다.


2
또한 Google GSon은 아직 순환 참조를 지원하지 않습니다. 잭슨이 처리합니까?
Guido

1
순환 참조 지원 ... 이것은 기본 기능이어야하지만 지원하는 지 확실하지 않습니다. 지금까지 순환 참조를 본 적이 없습니다 (특히 모델에서 매우 일반적이어야한다고 생각하더라도) . 다음은 GSon과 비교할 때 Jackson이 얼마나 빠른지 강조 할 수있는 또 다른 벤치 마크입니다. 그것은 직렬화 / 역 직렬화에 빠른 100 배를 보이는 code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson

1
Jackson은 현재 순환 참조를 처리하지 않습니다. 그것이 중요하다면, XStream은 그렇게합니다; 네이티브 json 패키지가 어떤 것인지 확실하지 않습니다 (flex-json?)
StaxMan

11
버전 1.6부터 Jackson은 순환 참조를 지원합니다. 참조 용 선언적 방법사용하여 양방향 참조 처리 를 참조하십시오.
Ophir Radnitz

잭슨은 더 많은 보안 문제를 가지고있다
TuGordoBello

83

Jackson과 Gson은 실제 데이터 바인딩 지원과 관련하여 가장 완벽한 Java JSON 패키지입니다. 다른 많은 패키지는 기본 맵 /리스트 (또는 동등한 트리 모델) 바인딩 만 제공합니다. 둘 다 일반적인 유형뿐만 아니라 많은 일반적인 사용 사례에 대한 충분한 구성 기능을 완벽하게 지원합니다.

Jackson에 대해 더 잘 알고 있기 때문에 Jackson이 Gson보다 더 완벽하게 지원한다고 생각하는 측면이 있습니다 (Gson 기능이 누락 된 경우 사과).

  • 광범위한 주석 지원; 전체 상속 및 고급 "믹스 인"주석 포함 (직접 주석을 추가 할 수없는 경우 주석을 클래스와 연결)
  • 초 고성능 (또는 메모리 제한) 사용 사례를위한 스트리밍 (증분) 읽기, 쓰기 데이터 바인딩 (바인딩 하위 트리)과 혼합 가능- 편집 : 최신 버전의 Gson에는 스트리밍 리더도 포함
  • 트리 모델 (DOM 유사 액세스); 다양한 모델 간 변환 가능 (트리 <-> Java 객체 <-> 스트림)
  • 기본 생성자뿐만 아니라 모든 생성자 (또는 정적 팩토리 메소드)를 사용할 수 있습니다.
  • 필드 및 게터 / 세터 액세스 (이전의 gson 버전은 필드 만 사용했으며 변경되었을 수 있음)
  • 기본 JAX-RS 지원
  • 상호 운용성 : JAXB 주석도 사용할 수 있으며 공통 패키지 (joda, ibatis, cglib), JVM 언어 (groovy, clojure, scala)에 대한 지원 / 해결 방법이 있습니다.
  • 출력에 대해 정적 (선언 된) 유형 처리를 강제하는 기능
  • 다형성 유형의 역 직렬화 지원 (Jackson 1.5)-목록과 같은 항목을 직렬화하고 역 직렬화 할 수 있습니다 (추가 유형 정보 사용).
  • 이진 콘텐츠에 대한 통합 지원 (base64와 JSON 문자열 간)

6
실제로이 게시물 ( cowtowncoder.com/blog/archives/2010/11/entry_434.html) 에는 다른 패키지에는없는 많은 Jackson 기능이 요약되어 있습니다.
StaxMan

12
나는 주석이 GSON의 기능이 아니라 결함 (위에 3 번 이상 나열)이 아니라고 생각할 것입니다.
orbfish

6
Jackson과 Gson 모두 주석을 사용할 필요가 없습니다. 그러나 주석을 옵션으로 사용하는 것은 내 의견에 귀중한 기능입니다 (예 : 외부 구성을 연결할 수있는 추가 처리 옵션 인 "혼합 주석").
StaxMan

3
Gson을 사용하면 기본 생성자를 사용하는 대신 인스턴스를 생성하는 다른 방법을 지정하기 위해 InstanceCreator를 등록 할 수 있습니다.
인디언 자리

37

Gson 1.6에는 이제 낮은 수준의 스트리밍 API와 실제로 Jackson보다 빠른 새로운 파서가 포함되어 있습니다.


나는 이것을 뒷받침하는 측정을 보는 데 관심이 있습니다. 최소한 wiki.fasterxml.com/JacksonInFiveMinutes 에서 측정 한 결과 여전히 GSON이 다른 Java json 패키지와 경쟁하지 않음을 나타냅니다.
StaxMan

1
우리는 간단한 객체 변환에서 저수준 스트리밍 API가 최대 10 배 빠를 수 있음을 보여주는 마이크로 벤치 마크를 사용할 수 있습니다 (트렁크 / 메트릭 디렉토리에서 Gson 하위 버전 저장소로 확인). 이 저수준 API가 현재 Jackson을 포함한 다른 라이브러리를 능가한다는 다른 벤치 마크도 있습니다 (원본 작성자의 게시를 권장해야 함). 그러나 포괄적이고 대표적인 벤치 마크를 만들려면 시간과 노력이 필요합니다.
인디언 자리

3
데이터 포인트 하나 더 : jvm-serializers ( github.com/eishay/jvm-serializers )에는 이제 데이터 바인딩의 대안으로 GSON 스트리밍 API를 사용하는 "gson / manual"테스트가 있습니다. 작성자가 '공식'번호를 실행하면 위키를 업데이트 할 수 있습니다. 그러나 이것을 로컬에서 실행하면 초고속 진술을 지원하지 않는다고 생각합니다.
StaxMan

12
(위에 덧붙여서 : 공식적인 숫자가 포함되었습니다-스트리밍 Gson은 데이터 바인딩보다 빠르지 만 Jackson 성능 수준
까지는 아닙니다

9
... 따라서 Gson 2.1은 결국 성능이 크게 향상되었습니다.
StaxMan

13

위에서 이미 다른 답변에 추가. 대소 문자를 구분하지 않는 것이 중요하다면 Jackson을 사용하십시오. 잭슨은 Gson이 키 이름에 대해 대소 문자를 구분하지 않습니다.

여기 두 개의 관련 링크가 있습니다

(아니요) Gson 에서 대소 문자 구분 지원 : GSON : Json에서 대소 문자 구분 요소를 얻는 방법은 무엇입니까?

Jackson의 대소 문자 구분 지원 https://gist.github.com/electrum/1260489


Jackson에서 대소 문자 구분 지원을위한 스 니펫이 작동하지 않습니다 . 또는 최상위 속성에서만 작동합니다. 속성을 중첩하면 솔루션이 작동하지 않는 것을 볼 수 있습니다.
Andres F.

1
실제로 대소 문자를 구분하지 않는 속성에 대한 공식적인 지원 MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES이 Jackson 2.5에 추가되었습니다. 따라서 사용자 지정 코드를 추가 할 필요가 없습니다.
StaxMan

6

GSon은 JAXB를 지원하지 않는 것 같습니다. JAXB 어노테이션이있는 클래스를 사용하여 JSON 메시지를 작성하거나 처리함으로써 스프링 MVC를 사용하여 동일한 클래스를 공유하여 Restful Web Service 인터페이스를 작성할 수 있습니다.


Hibernate에 대한 데이터 클래스에 이미 주석이 있으면 JAXB에 대한 다른 세트를 원하지 않습니다.
orbfish

1
"외부"주석에 대한 지원을 추가 할 수있어 좋습니다. Jackson에는 JAXB 주석 모듈 (선택 사항)과 몇 가지 주석 (일시적, 지연 로딩)을위한 최대 절전 모드 모듈이 있습니다. 모듈 식 확장도 가능하도록 Gson을 확장 할 수 있습니다.
StaxMan

2
특히 JAXB는 표준입니다!
maxxyme
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.