잭슨 대 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.