Jackson and Gson are the most complete Java JSON packages regarding actual data binding support; many other packages only provide primitive Map/List (or equivalent tree model) binding.
Both have complete support for generic types, as well, as enough configurability for many common use cases.
Since I am more familiar with Jackson, here are some aspects where I think Jackson has more complete support than Gson (apologies if I miss a Gson feature):
- Extensive annotation support; including full inheritance, and advanced "mix-in" annotations (associate annotations with a class for cases where you can not directly add them)
- Streaming (incremental) reading, writing, for ultra-high performance (or memory-limited) use cases; can mix with data binding (bind sub-trees)
- Tree model (DOM-like access); can convert between various models (tree <-> java object <-> stream)
- Can use any constructors (or static factory methods), not just default constructor
- Field and getter/setter access (earlier gson versions only used fields, this may have changed)
- Out-of-box JAX-RS support
- Interoperability: can also use JAXB annotations, has support/work-arounds for common packages (joda, ibatis, cglib), JVM languages (groovy, clojure, scala)
- Ability to force static (declared) type handling for output
- Support for deserializing polymorphic types (Jackson 1.5) -- can serialize AND deserialize things like List correctly (with additional type information)
- Integrated support for binary content (base64 to/from JSON Strings)