Skip to content

Jackson Release 2.9

Tatu Saloranta edited this page Mar 31, 2017 · 175 revisions

Version 2.9 development is on-going, as of March 2017: second pre-release (2.9.0.pr2) was released on March 21, 2017, and the goal is to release final 2.9.0 in April.

New Modules, status changes

Changes: compatibility

java.sql.Date

As per databind#219 java.sql.Date will finally use same "timestamp-or-String" determination as java.util.Date and java.util.Calendar. This means that with vanilla, unchanged settings, values will be serialized as numeric timestamps. Note that the default String serialization will still default to java.sql.Date.String(), and not to default formatting java.util.Date uses.

Major features of 2.9

Implemented

  1. Add separate exception type for "pojo configuration problem" (InvalidDefinitionException), distinct from "json input" problem; in general to distinguish between bad configuration (server-side issue) and bad data (client issue) #1356
  2. Per-property custom serialization inclusion (@JsonInclude(value=Include.CUSTOM, valueFilter=MyExcluder.class) #888
  3. Per-property overwrite-vs-merge annotation/handling, to allow for merging of configuration information (for example) #1399
    • note: on-going work to increase coverage; some types (arrays, tree nodes) not yet supported
  4. Ability to override handling of null for deserialization #1402
  5. Aliases, to allow migration: alternate property id names to accept (but not write) #1029

Under construction

  1. #1583 DeserializationFeature to automatically verify that value bound is full value and there is no trailing junk in input ("whole value verification")

Planned

  1. Ability to force "inject-only" variant of @JacksonInject #1381 -- also solves a few related issues wrt un-deserializable injectable values (which are common)
  2. Non-blocking JSON/Smile parser?
  3. Allow pre-defining Object Ids; pluggable Object Id converters? #693
  4. A way to force a supertype as type id to use during serialization: this is needed to avoid deserialization problems for things like concrete Hibernate collection type. #789
  5. Low-level String post-processor? jackson-core#355

And possibly

  • Protobuf: Schema building by hand
  • Comma-separated "ints in a String" #1242
  • Support for @JsonIncludeProperties (opposite of @JsonIgnoreProperties) #1296
  • "Safe" ObjectReader, ObjectWriter; that is, ones that does NOT throw checked exceptions (wrap IOExceptions), to work better with Java 8 Streams #779

Changes likely to be postponed

Some things that we are aware of but that very likely get postponed:

  • @JsonUnwrapped improvements, which need major rewrite of unwrapped deserialization:
    • Support for @JsonUnwrapped as @JsonCreator parameter
    • Catching "unknown" properties
  • Rewrite of property/creator introspection code, to resolve most open issues wrt Creator auto-detection and name-detection

Change list

Changes, core

  • #103: Add JsonInclude.Include.CUSTOM, properties for specifying filter(s) to use
  • #104: Add new properties in @JsonSetter: nulls/contentNulls
  • #105: Add @JsonFormat.lenient to allow configuring lenience of date/time deserializers
  • #108: Allow @JsonValue on fields
  • #109: Add enabled for @JsonAnyGetter, @JsonAnySetter, to allow disabling via mix-ins
  • #113: Add @JsonMerge to support (deep) merging of properties
  • #116: Add @JsonAlias annotation to allow specifying alternate names for a property
  • Allow use of @JsonView on classes, to specify Default View to use on non-annotated properties.
  • #17: Add 'JsonGenerator.writeString(Reader r, int charLength)'
  • #312: Add JsonProcessingException.clearLocation() to allow clearing possibly security-sensitive information
  • #314: Add a method in JsonParser.isNan() to allow checking for "NaN" values
  • #323: Add JsonParser.ALLOW_TRAILING_COMMA to work for Arrays and Objects
  • #325: DataInput backed parser should handle EOFException at end of doc
  • #340: Make WriterBasedJsonGenerator non-final
  • #356: Improve indication of "source reference" in JsonLocation wrt byte[],char[]
  • #219: SqlDateSerializer does not obey SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS
  • #476: Allow "Serialize as POJO" using @JsonFormat(shape=Shape.OBJECT) class annotation
  • #507: Support for default @JsonView for a class
  • #888: Allow specifying custom exclusion comparator via @JsonInclude, using JsonInclude.Include.CUSTOM
  • #1029: Add a way to define property name aliases
  • #1035: @JsonAnySetter assumes key of String, does not consider declared type
  • #1284: Make StdKeySerializers use new JsonGenerator.writeFieldId() for int/long keys
  • #1320: Add ObjectNode.put(String, BigInteger)
  • #1341: DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY
  • #1347: Extend ObjectMapper.configOverrides() to allow changing visibility rules
  • #1356: Differentiate between input and code exceptions on deserialization
  • #1369: Improve @JsonCreator detection via AnnotationIntrospector by passing MappingConfig
  • #1371: Add MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES to allow disabling use of @CreatorProperties as explicit @JsonCreator equivalent
  • #1376: Add ability to disable JsonAnySetter/JsonAnyGetter via mixin
  • #1399: Add support for @JsonSetter(merge=OptBoolean.TRUE) to allow "deep update"
  • #1402: Use @JsonSetter(nulls=...) to specify handling of null values during deserialization
  • #1406: ObjectMapper.readTree() methods do not return null on end-of-input
  • #1407: @JsonFormat.pattern is ignored for java.sql.Date valued properties
  • #1428: Allow @JsonValue on a field, not just getter
  • #1454: Support @JsonFormat.lenient for java.util.Date, java.util.Calendar
  • #1480: Add support for serializing boolean/Boolean as number (0 or 1)
  • #1520: Case insensitive enum deserialization feature.
  • #1552: Map key converted to byte array is not serialized as base64 string
  • #1554: Support deserialization of Shape.OBJECT ("as POJO") for Maps (and map-like types)
  • #1556: Add ObjectMapper.updateValue() method to update instance with given overrides

Changes, data formats

  • #13: Add support for Avro default values
  • #14: Add support for Avro annotations via AvroAnnotationIntrospector
  • #15: Add a way to produce "file" style Avro output
  • #57: Add support for @Stringable annotation
  • #59: Add support for @AvroAlias annotation for Record/Enum name evolution
  • #60: Add support for @Union and polymorphic types
  • #69: Add support for @AvroEncode annotation
  • Upgrade avro-core dep from 1.7.7 to 1.8.1
  • #127: Add CsvGenerator.Feature.ALWAYS_QUOTE_EMPTY_STRINGS to allow forced quoting of empty Strings
  • #130: Add fluent addColumns operation to CsvSchema.Builder
  • #137: Inject "missing" trailing columns as nulls (JsonParser.Feature.INSERT_NULLS_FOR_MISSING_COLUMNS)
  • #139: Add CsvParser.Feature.ALLOW_TRAILING_COMMA to allow enforcing strict handling
  • #140: Fail for missing column values (JsonParser.Feature.FAIL_ON_MISSING_COLUMNS)
  • #142: Add methods for appending columns of a CsvSchema into another
  • Add new exception type CsvMappingException to indicate CSV-mapping issues (and give access to effective Schema)
  • #1: Add convenience method(s) for reading System properties
  • #3: Write into Properties instance (factory, mapper) using JavaPropsMapper.writeValue() with Properties and JavaPropsMapper.writeValueAsProperties()
  • #4: Allow binding from Properties instance
  • #67: Add YAMLGenerator.Feature.INDENT_ARRAYS
  • #76: Add YAMLGenerator.Feature.LITERAL_BLOCK_STYLE for String output

Changes, datatypes

  • #13: configureAbsentsAsNulls not working for primitive optionals like OptionalInt
  • #15: Optional and OptionalLong deserialization are not consistent when deserializing from String
  • #17: Cached Optional serializer does not apply annotations for POJO properties
  • #18: InstantDeserializer is not working with offset of zero +00:00 and +00

Changes, other modules

  • #119: dependencies property should not be an Array but Object

Clone this wiki locally