Project: jackson-datatypes-text
Modules:
  jackson-dataformat-csv
  jackson-dataformat-properties
  jackson-dataformat-yaml
Versions 3.x (for earlier see VERSION-2.x)

Contains streaming API format codec implementations for supported textual formats
(except for xml which is in separate repo)
as well as support for integration via `jackson-databind` (`ObjectMapper` subtype
implementations)
 
------------------------------------------------------------------------
=== Releases ===
------------------------------------------------------------------------

3.3.0 (07-Nov-2026)

#699: (csv) Ability to modify columns in `CsvSchema.Builder` by name
 (requested by @OrangeDog)
 (fix by @seonwooj0810)
#718: (csv, properties,toml,yaml) Fix `AUTO_CLOSE_SOURCE` overrides and recycled-buffer
  leaks on read paths
 (fix by @pjfanning)
#719: (csv) Output written to `OutputStream` lost entirely when
  both `AUTO_CLOSE_TARGET` and `FLUSH_PASSED_TO_STREAM` are disabled
 (fix by @pjfanning)
#720: (properties, toml) Do not close a Jackson-opened File/Path source twice
  when parsing fails
 (reported by @cowtowncoder)
 (fix by @kalayciburak)
#721: (csv) Write `double`/`float` values directly into output buffer (via
  `NumberOutput.outputDouble()/outputFloat()`) when `USE_FAST_DOUBLE_WRITER`
  enabled, avoiding intermediate `String`
 (fix by @pjfanning)
#722: (properties, toml, yaml) Use `NumberOutput` for writing numbers; respect
  `StreamWriteFeature.USE_FAST_DOUBLE_WRITER` for `double`/`float` (previously
  ignored by these modules), writing directly into output buffer where possible
 (fix by @pjfanning)
#724: (csv) Single-pass String value writing in `CsvEncoder` (copy into output
  buffer, then scan for quoting need); `char[]` values no longer converted to
  `String` unless quoting needed; numeric array elements appended without
  intermediate `String`
 (fix by @pjfanning)
#725: (toml) Use lookup table for ASCII character categorization when writing
  Strings/keys; avoid `substring()`/`toString()` in `writeRaw()` variants;
  also fix escaping of `char[]` String values, missing newline after raw values
  and extra blank line after `writeUTF8String()`
 (fix by @pjfanning)
#727: (csv) Avoid `char[]` copy of value text when parsing integer numbers
  in `CsvDecoder` (parse directly from already-materialized `String`)
 (fix by @pjfanning)
#734: (properties) Output written to `OutputStream` lost entirely when
  both `AUTO_CLOSE_TARGET` and `FLUSH_PASSED_TO_STREAM` are disabled
 (fix by @pjfanning)
#735: (toml) Output written to `OutputStream` lost entirely when
  both `AUTO_CLOSE_TARGET` and `FLUSH_PASSED_TO_STREAM` are disabled
 (fix by @pjfanning)
#739: (toml) `TreeTraversingParser` created by `TomlFactory` does not use
  factory's `StreamReadConstraints`
 (reported by @cowtowncoder)
 (fix by @kas5852)
#747: (toml) `TomlGenerator`: centralize value termination to avoid
  missing/duplicate line feeds; share String quoting/escaping implementation
 (fix by @cowtowncoder)
#749: (yaml) Fix `YAMLGenerator` flushing/closing of output target:
  - (UTF-8) `OutputStream`: `flush()` did not write buffered content with
    `FLUSH_PASSED_TO_STREAM` disabled, and internal `UTF8Writer` was not closed
    (nor its buffer recycled) with `AUTO_CLOSE_TARGET` disabled
  - SnakeYAML flushed target (`OutputStream` or `Writer`) at end of every document
    regardless of `FLUSH_PASSED_TO_STREAM`
  - `flush()` after `close()` flushed (already closed) target
  - `streamWriteOutputTarget()` returned internal `UTF8Writer`, not caller's stream
  - failure on `close()` could mask an earlier failure
 (fix by @cowtowncoder)
#751: (properties) `WriterBackedGenerator`: `flush()` after `close()` failed with
  "Stream closed", `streamWriteOutputTarget()` returned internal `OutputStreamWriter`
  instead of caller's stream, and failure on `close()` could mask an earlier failure
 (fix by @cowtowncoder)
#750: (toml) `TomlGenerator`: `flush()` after `close()` flushed (already closed) target,
  `streamWriteOutputTarget()` returned internal `UTF8Writer` instead of caller's stream,
  and failure on `close()` could mask an earlier failure
 (fix by @cowtowncoder)
#752: (yaml) `YAMLGenerator`: caller's `OutputStream` not closed (with `AUTO_CLOSE_TARGET`
  enabled) if writing out buffered content failed with an unchecked exception
  (follow-up to #749)
 (fix by @cowtowncoder)
#755: (toml) `TomlParser`: use a single `StreamReadConstraints` source
 (fix by @cowtowncoder)
#758: (toml) `TomlGenerator`: invalid TOML output (with empty key) for root-level values:
  empty root Object (and root `null`) now written as empty document; root-level arrays
  and scalars, multiple root-level values, and property names outside an Object,
  now fail with `TomlStreamWriteException`
 (reported by @cowtowncoder)
 (fix by @caiocv18)
#763: (csv) Overlong UTF-8 sequences, encoded surrogates and values beyond U+10FFFF
  not rejected; wrong char/byte positions in invalid UTF-8 error messages
  (NOTE: CESU-8 / "Modified UTF-8" content is now also rejected)
 (fix by @pjfanning)
#764: (yaml) Overlong UTF-8 sequences, encoded surrogates and values beyond U+10FFFF
  not rejected; wrong char/byte positions in invalid UTF-8 error messages
  (NOTE: CESU-8 / "Modified UTF-8" content is now also rejected)
 (fix by @pjfanning)
#765: (toml) Wrong byte position (`byte #-1`) in invalid UTF-8 error messages
 (fix by @pjfanning)
#779: (toml) `TomlGenerator`: dangling property name at `writeEndObject()` not rejected
  (written as empty table), leaves pending name in reused context
 (reported by @cowtowncoder)
 (fix by @cowtowncoder)
#781: (toml) `TomlGenerator.writeName()`: rejected key leaves generator stuck
 (reported by @cowtowncoder)
 (fix by @caiocv18)

3.2.4 (18-Oct-2026)

#726: (toml) `TomlGenerator.writeString(char[], int, int)` writes wrong characters
  or throws `ArrayIndexOutOfBoundsException` when value needs escaping
 (fix by @pjfanning)
#746: (toml) Fix multiple `TomlGenerator` value-writing issues: `writeUTF8String()`
  writes an extra empty line; `writeRawValue()` writes no line feed after value;
  `writeBinary()` silently pads invalid ranges with zero bytes; `writeString()`,
  `writeRaw()` do not validate offset/length; String value with unsupported
  characters fails after key is written, with misleading "Key contains ..." message

3.2.3 (21-Sep-2026)

#723: (toml) `TomlGenerator.writeNumber(short)` writes an extra empty line
  after the value (calls `writeValueEnd()` twice)
#736: (toml) Support `StreamReadConstraints` maxNameLength/maxDocumentLength
  in TOML parser
 (fix by @pjfanning)
#737: (yaml) Support `StreamReadConstraints.maxDocumentLength()` for YAML parser
 (fix by @pjfanning)
#738: (properties) Support `StreamReadConstraints.maxDocumentLength()` for
  Properties parser
 (fix by @pjfanning)

3.2.2 (14-Aug-2026)

#701: (yaml) `ALWAYS_QUOTE_NUMBERS_AS_STRINGS` does not quote exponent (`1e5`)
  and non-finite (`.inf`, `.nan`) number forms
 (reported by @EverNife)
 (fix contributed by @seonwooj0810)
#702: (toml) Expand nesting depth checks for dotted keys [CVE-2026-85278]
 (contributed by @yawkat)
#707: (yaml) Should constraint deeply nested YAML merge keys in
  `YAMLAnchorReplayingParser` (GHSA-255r-36wv-4qpr)
 (reported by Michał M)

3.2.1 (10-Jul-2026)

No changes since 3.2.1

3.2.0 (08-Jun-2026)

#9: (csv) Incorrect detection of `hasNextValue()` for simple iteration with `String[]`
 (fix by @cowtowncoder, w/ Claude code)
#22: (yaml) YAML anchors don't seem to work with `@JsonCreator`
 (reported by Rye G)
 (fix by @cowtowncoder, w/ Claude code)
#25: (yaml) Yaml anchor error when `@JsonSubTypes` used
 (reported by @mopsop)
 (fix by @cowtowncoder, w/ Claude code)
#36 (yaml) Allow emitting YAML comments
 (requested by Daniel L)
 (fix by @cowtowncoder, w/ Claude code)
#109: (yaml) `YAMLMapper` doesn't close output file if an error occurs
 (reported by Martin W)
 (fix by @cowtowncoder, w/ Claude code)
#210: (csv) Quote strings with leading/trailing spaces in csv
  (`CsvWriteFeature.QUOTE_STRINGS_WITH_LEADING_TRAILING_WHITESPACE`)
 (requested by @sfzhi)
 (implemented by @cowtowncoder, w/ Claude code)
#214: (yaml) Expose custom tags via `YAMLParser.getRawTag()`
 (requested by Alexander T)
 (fix by @cowtowncoder, w/ Claude code)
#264: (csv) `CsvMapper` applies alphabetic Property Order  for Java Records
 (reported by @alexpartsch)
 (fix by @cowtowncoder)
#276: (yaml) Support opting out of octal number interpretation (like "0444");
  add `YAMLReadFeature.PARSE_OCTAL_NUMBERS`
 (requested by David X)
 (fix by @cowtowncoder, w/ Claude code)
#292: (yaml) YAML anchor `UnresolvedForwardReference` with builder
 (reported by Aleksandr D)
 (fix by @cowtowncoder, w/ Claude code)
#327: (csv) Catch and report duplicate column names in header line (add
  `CsvReadFeature.FAIL_ON_DUPLICATE_HEADER_COLUMNS`)
 (fix by @cowtowncoder, w/ Claude code)
#355: (csv) Allow mapping empty cells (columns) as "absent" properties (i.e. skip)
  by `CsvReadFeature.EMPTY_UNQUOTED_STRING_AS_MISSING`
 (requested by @hosswald)
 (fix by @cowtowncoder, w/ Claude code)
#368: (csv) Allow skipping csv rows with only empty values (line of commas)
 (requested by @GitXm123)
 (fix by @cowtowncoder, w/ Claude code)
#623: (yaml) Add support for YAML 1.2 non-finite (Infinite, -Infinite, NaN)
  numbers, Octal notation
 (contributed by Michael C)
#631: (csv) Add `CsvFactory.builder().maxQuoteCheckChars()` for configuring
  heuristic quoting check
 (fix by @cowtowncoder, w/ Claude code)
#634: (csv) Support for `StreamReadConstraints.maxNameLength` for CSV parsing
 (fix by @cowtowncoder, w/ Claude code)
#636: (yaml) Support for `StreamReadConstraints.maxNameLength` and
  `maxStringLength` for YAML parsing
 (fix by @cowtowncoder, w/ Claude code)
#638: (properties) Support for `StreamReadConstraints.maxNameLength` and
  `maxStringLength` for Properties parsing
 (fix by @cowtowncoder, w/ Claude code)
#643: (csv) `CsvParser` doesn't handle whitespace outside of quoted values correctly
 (reported by @tomdz)
 (fix by @cowtowncoder, w/ Claude code)
#657: (csv) CSV header validation ignores `ACCEPT_CASE_INSENSITIVE_PROPERTIES`:
  add `CsvReadFeature.CASE_INSENSITIVE_HEADERS`
 (reported by Tomas H)
 (fix by @cowtowncoder, w/ Claude code)
#663: (toml) TOML parser: int64 max value parsed as truncated long
 (reported by @rajulbhatnagar)
  (fix by @yawkat)
#664: (toml) TOML parser: space separator in offset/local datetime not accepted 
 (reported by @rajulbhatnagar)
 (fix by @yawkat)
#665: (toml) TOML parser: leading UTF-8 BOM rejected as 'Unknown token'
 (reported by @rajulbhatnagar)
 (fix by @yawkat)
#666: (toml) TOML parser: invalid UTF-8 byte sequences not rejected
 (reported by @rajulbhatnagar)
 (fix by @yawkat)
#667: (toml) TOML parser: out-of-range datetime/date/time field values not rejected
 (reported by @rajulbhatnagar)
 (fix by @yawkat)
#668: (toml) TOML parser: surrogate-half unicode escapes accepted in strings
 (reported by @rajulbhatnagar)
 (fix by @yawkat)
#669: (toml) TOML parser: invalid dotted-key extension of explicit
  tables / AOT not rejected
 (reported by @rajulbhatnagar)
 (fix by @yawkat)
#685: (toml) Improve TOML 1.1.0 compatibility (parsing)
 (fix by @yawkat)

3.1.8 (17-Oct-2026)

#726: (toml) `TomlGenerator.writeString(char[], int, int)` writes wrong characters
  or throws `ArrayIndexOutOfBoundsException` when value needs escaping
 (fix by @pjfanning)
#746: (toml) Fix multiple `TomlGenerator` value-writing issues: `writeUTF8String()`
  writes an extra empty line; `writeRawValue()` writes no line feed after value;
  `writeBinary()` silently pads invalid ranges with zero bytes; `writeString()`,
  `writeRaw()` do not validate offset/length; String value with unsupported
  characters fails after key is written, with misleading "Key contains ..." message

3.1.7 (21-Sep-2026)

#723: (toml) `TomlGenerator.writeNumber(short)` writes an extra empty line
  after the value (calls `writeValueEnd()` twice)
#736: (toml) Support `StreamReadConstraints` maxNameLength/maxDocumentLength
  in TOML parser
 (fix by @pjfanning)
#737: (yaml) Support `StreamReadConstraints.maxDocumentLength()` for YAML parser
 (fix by @pjfanning)
#738: (properties) Support `StreamReadConstraints.maxDocumentLength()` for
  Properties parser
 (fix by @pjfanning)

3.1.6 (14-Aug-2026)

#701: (yaml) `ALWAYS_QUOTE_NUMBERS_AS_STRINGS` does not quote exponent (`1e5`)
  and non-finite (`.inf`, `.nan`) number forms
 (reported by @EverNife)
 (fix contributed by @seonwooj0810)
#702: (toml) Expand nesting depth checks for dotted keys [CVE-2026-85278]
 (contributed by @yawkat)
#707: (yaml) Should constraint deeply nested YAML merge keys in
  `YAMLAnchorReplayingParser` (GHSA-255r-36wv-4qpr)
 (reported by Michał M)

3.1.5 (07-Jul-2026)

No changes since 3.1.4

3.1.4 (29-May-2026)

#679: (toml) Validate integer length for hex/octal/binary radix literals
 (fix by @tonghuaroot)
#680: (yaml) Restore `validateIntegerLength()` check in `_decodeBigInt`
 (fix by @tonghuaroot)

3.1.3 (01-May-2026)
3.1.2 (11-Apr-2026)

No changes since 3.1.1

3.1.1 (27-Mar-2026)

#615: (csv) Feature `CsvReadFeature.EMPTY_UNQUOTED_STRING_AS_NULL` ignored
 (reported by Henning L)
#624: (yaml) Fix YAML anchor replaying parser producing invalid sequence of events
  when using the merge operator inside an anchor
 (fix by Théo S)

3.1.0 (23-Feb-2026)

#479: (csv) `STRICT_CHECK_FOR_QUOTING` does not quote value that contains newline character
 (reported by @zhuhw)
#568: (yaml) YAML - ScannerException on block scalar "\n"
 (reported by @benken-parasoft)
 (fix by Andrey S)
#579: (csv): Incorrect detection of missed columns in header line if columns
  reordering is enabled
 (fix by Alexander F)
#581: (csv, toml, yaml) Add `isEnabled()` methods for format-specific
  features to mappers 
#590: (yaml) Upgrade to the latest version of SnakeYAML Engine (3.0.1)
 (contributed by Andrey S)
#596: (yaml) Port `YAMLAnchorReplayingFactory` from 2.x and improve it
  to handle nested anchors
 (contributed by Théo S)
#601: (csv) Reader should allow separating plain `nullValue` and quoted value `"nullValue"`
 (requested by Dmitry B)
#604: (csv) Remove `CsvParser.enable()`/`.disable()`/`.configure()` (reduce mutability)
#608: (csv, toml, yaml) Fix issue with UTF-8 surrogate pair decoding
 (fix by @pjfanning)
#609: (yaml) Catch and rethrow yaml engine internal exception on generation
 (fix by @pjfanning)
#613: (csv) Support `StreamReadConstraints.maxDocumentLength()` validation
  for CSV module

3.0.3 (28-Nov-2025)
3.0.2 (07-Nov-2025)
3.0.1 (21-Oct-2025)

No changes since 3.0.0

3.0.0 (03-Oct-2025)

#106: (yaml) Upgrade to `snakeyaml-engine` (from classic `snakeyaml`)
 (contributed by Andrey S)
#215: (yaml) .without(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)
  seems to be ignored
 (reported by @jdimeo)
#320: Rename "com.fasterxml.jackson" -> "tools.jackson"
#374: (csv) Should verify that escape character set if enabling
  `CsvGenerator.Feature.ESCAPE_QUOTE_CHAR_WITH_ESCAPE_CHAR`
 (suggested by @SebastianSolidwork)
#510: (csv) JSTEP-8: rename `CsvParser.Feature` as `CsvReadFeature`,
  `CsvGenerator.Feature` as `CsvWriteFeature`
#512: (yaml) JSTEP-8: rename `YAMLParser.Feature` as `YAMLReadFeature`,
  `YAMLGenerator.Feature` as `YAMLWriteFeature`
#531: Change 3.0 to use `module-info.java` directly [JSTEP-11]
- (csv) Remove `CsvMappingException` (replaced by `CsvRead-/-WriteException`)
- Add `XxxMapper.shared()` methods for getting globally shared default instances
- Minimum Java baseline: Java 17
- Properties module name now: "tools.jackson.dataformat.properties" (not "...javaprop")
- (yaml) `snakeyaml-engine` to 2.10 (from 2.8)
- Branch rename "master" -> "3.x" [JSTEP-12]
