Version: 1.9.13
Release date: xx-xxx-2013

Another patch release for 1.9.

Fixes:

* [JACKSON-887]: StackOverflow with parameterized sub-class field
 (reported by Alexander M)
* [JACKSON-889]: Parsing error in 'nextFieldName()'

------------------------------------------------------------------------
=== History: ===
------------------------------------------------------------------------

1.9.12 (25-Jan-2013)

Fixes:

* One more case for [JACKSON-802] (class loading using Class.forName())
* [JACKSON-875]: Enums are not properly serialized when
  Feature.USE_ANNOTATIONS is disabled
 (reported by Laurent P)
* [JACKSON-884]: JsonStringEncoder.quoteAsStringValue() fails to encode
  ctrl chars correctly.
* [Issue#38]: Infinite loop in `JsonParser.nextFieldName()` with trailing
 space after field name
 (reported by matjazs@github)
* [Issue#42]: NPE in UTF-32 parser
 (reported by James R)

1.9.11 (06-Nov-2012)

Fixes:

* [Issue#8]: Problem with 'SmileGenerator', addSeenName()

1.9.10 (23-Sep-2012)

Fixes:
  * [JACKSON-855]: add StackOverflowError as root cause
  * [JACKSON-867]: missing Export-Package header for "org.codehaus.jackson.map.ext"
   (reported by Duncan B)
  * [Issue#57]: Allow serialization of JDK proxy types
  * [Issue#71]: java.util.concurrent.ConcurrentNavigableMap support was failing

1.9.9 (28-Jul-2012)

Fixes:
  * [Issue-21]: Improve handling of String hash code collisions for
   symbol tables; exception for degenerate cases (attacks), improvements
   for calculation otherwise
  * [Issue-24]: ArrayIndexOutOfBoundsException with TextBuffer.append()
  * [JACKSON-853]: JsonStringEncoder.quoteAsString() problem with buffer boundary

Other:
  * Improved multi-threader handling of byte-based symbol table; should
    reduce lock contention for heavily multi-threaded cases, esp. when
    parsing short documents.


1.9.8 (28-Jun-2012)

Fixes:

  * [Issue-6]: element count for PrettyPrinter, endObject wrong
   (reported by "thebluemountain")
  * [JACKSON-838]: Utf8StreamParser._reportInvalidToken() skips letters
    from reported token name
   (reported by Lóránt Pintér)
  * [JACKSON-841] Data is doubled in SegmentedStringWriter output
   (reported by Scott S)
  * [JACKSON-842] ArrayIndexOutOfBoundsException when skipping C-style comments
   (reported by Sebastien R)
  * [JACKSON-845] Problem with Object[][] deserialization, default typing
   (reported by Pawel J)

1.9.7 (02-May-2012)

  Fixes:

  * [Smile/Issue-2] SmileParser failed to decode surrogate-pair characters for
    long Strings
   (reported by Steven S)
  * [Issue-11] JsonParser.getValueAsLong() returning int, not long
   (reported by Daniel L)
  * [Issue-13] Runtime error passing multiple injected values to a constructor
   (reported by Stuart D)
  * [Issue-14]: Annotations were not included from parent classes of
    mix-in classes
   (reported by @guillaup)
  * [JACKSON-823] MissingNode does not return default value for 'asXxx()'
   methods
   (reported by Adam V)
  * [JACKSON-829] Custom serializers not working for List<String> properties,
    @JsonSerialize(contentUsing)
   (reported by James R)
  * [JACKSON-831] External type id, explicit property do not work well together
   (reported by Laurent P)
  * [JACKSON-832] (partial) Fix numeric range check for Longs (was not working)
   (reported by Jan J)
  * [JACKSON-834] Could not use @JsonFactory with non-String argument with Enums
   (reported by Klaus R)

1.9.6 [26-Mar-2012]

  Fixes:

  * [JACKSON-763] State of base64/byte[] decoding not reset when
    using 'convertValue()' for list of byte[] values.
   (reported by Erik G)
  * [JACKSON-794]: JDK 7 has new property for Exceptions ("suppressable"),
    needs to be ignored during deserialization
  * [JACKSON-799]: JsonSerialize.as not working as class annotation, for root values
  * [JACKSON-802]: Improvements to class loading to use both contextual
    class loader and Class.forName, as necessary
  * [JACKSON-803]: Problems with Smile, parsing of long names
   (reported by D Lam)
  * [JACKSON-804]: Allow byte range up to 255, for interoperability with unsigned bytes
  * [JACKSON-806]: REQUIRE_SETTERS_FOR_GETTERS ignores explicitly annotated getters
   (reported by Harold M)
  * [JACKSON-812]: BigIntegerNode.equals(...) using '==' for equality
  * [JACKSON-820]: WriterBasedGenerator with CharacterEscapes produces unescaped output
    for strings > 2k in length
   (reported by Matt S)

1.9.5 [24-Feb-2012]

  Fixes:

  * [JACKSON-757]: further fixing (1.9.4 had partial fix)
  * [JACKSON-773]: Bug in SimpleFilterProvider constructor
   (reported by Kenny M)
  * [JACKSON-774]: PropertyBasedCreator was not using JsonDeserializer.getNullValue()
   (reported by Nathaniel B)
  * [JACKSON-775]: MissingNode.asText() should return "", not null
   (reported by Ittai Z)
  * [JACKSON-778]: Incorrect detection of generic types with TypeReference
   (reported by Vladimir P)
  * [JACKSON-779]: Problems with multi-byte UTF-8 chars in JSON comments
   (reported by Alexander K)
  * [JACKSON-789]: Add support for 'java.nio.charset.Charset'
  * [JACKSON-796]: Problems with byte[] conversion to/from JsonNode.
   (reported by Christopher B)

1.9.4 [20-Jan-2012]

  Fixes:

  * [JACKSON-712] Issue with @JsonCreator + DefaultImpl
   (suggested by Eric T)
  * [JACKSON-744] @JsonAnySetter problems with 1.9
  * [JACKSON-746] Problems with JsonTypeInfo.Id.NONE, default typing
   (reported by Steve L)
   (reported by Sebastian T)
  * [JACKSON-756] Problems with enums, @JsonCreator, when used as keys
    of EnumMap, regular Map, or contents of EnumSet
   (reported by Mika M)
  * [JACKSON-757] Problems with Enum values, annotations on constructors
     -- but note, some issues remained for 1.9.5 to tackle
   (reported by Stephan B)

  (all fixes up to 1.8.8)
  
1.9.3 [16-Dec-2011]

  Improvements:

  * [JACKSON-657] Add Date/Calendar key deserializers
   (contributed by Andreas K, Tobias S)
  * [JACKSON-717] ObjectReader.updateValues(): use configured 'valueToUpdate'
  * [JACKSON-726] Add java.util.UUID key deserializer
   (suggested by Steven S)
  * [JACKSON-729] Add 'ObjectMapper.readValues(byte[])' convenience method

  Fixes:

  (all fixes up to 1.8.7)

1.9.2 [04-Nov-2011]

  Improvements:
  
  * [JACKSON-706] Joda support: add support for "org.joda.time.Period"
    (suggested by Dain S)
  
  Fixes:

  * [JACKSON-700] Type problems with properties that have different types
    for constructor property, setter and/or field
   (reported by Ben H)
  * [JACKSON-703] 'SerializationConfig.isEnabled(...)',
    'DeserializationConfig.isEnabled(...)' incompatible due to signature change

1.9.1 [23-Oct-2011]

  Fixes:
  
  * [JACKSON-687] Problems with PropertyNamingStrategy, property merging
   (reported by Pascal G)  
  * [JACKSON-689] Deserialization of Iterable fails
   (reported by Pascal G)
  * [JACKSON-693] @JsonBackReference not used during deserialization if it's annotated
   on a getter method.
   (reported by Pascal G)

1.9.0 [04-Oct-2011]

  Fixes:
  
  * [JACKSON-539] Incorrect handling of combination of JAXB annotations
    (@XmlTransient with property renaming)
   (reported Ryan H)
  * [JACKSON-605] Handle deserialization of typed Class properties correctly
   (reported by Bruce P)

  Improvements:

  * [JACKSON-242] Rewrite property introspection part of framework to combine
    getter/setter/field annotations
  * [JACKSON-505] Handle missing type information gracefully by checking for
    abstract type mapping to find default implementation, if no valid type
    information found for @JsonTypeInfo
  * [JACKSON-531] Comparing actual and default value (for JsonSerialize.Inclusion.NON_DEFAULT)
    should check array contents
    (suggested by Christoph S)
  * [JACKSON-584] Serialize type info for non-static anonymous inner classes
    as that of declared (static) type
    (suggested by Earl B)
  * [JACKSON-593] Add ObjectMapper.readTree(byte[]), (URL) variants
   (suggested by Bruce P)
  * [JACKSON-594] Allow deserializing non-static inner class valued properties
   (suggested by Bruce P)
  * [JACKSON-595] Terse Visibility Config (ObjectMapper.setVisibility, related)
   (suggested by Bruce P)
  * [JACKSON-598] Add set of standard naming-strategy implementations
   (suggested by Bruce P)
  * [JACKSON-599] Expose Settability Of SimpleModule Serializers/Deserializers
   (suggested by Bruce P)
  * [JACKSON-606] Add Built-in Support for Date Map Keys as Timestamps
   (SerializationConfig.Feature#WRITE_DATE_KEYS_AS_TIMESTAMPS)
  * [JACKSON-612] Expose 'readValues()' methods via ObjectCodec, JsonParser
   (suggested by Bruce P)
  * [JACKSON-613] Add ArrayNode/ObjectNode methods for dealing with wrapper
    values, unboxing, nulls
   (suggested by Bruce P)
  * [JACKSON-615] Make JavaType serializable/deserializable
  * [JACKSON-616] Better handling of primitive deserializers, to avoid NPEs
   (suggested by Bruce P)
  * [JACKSON-619] SmileParser.getCurrentLocation(), getTokenLocation() did not
    report actual byte offsets.
   (reported by Ray R)
  * [JACKSON-620] Allow empty String to mean null Map, Collection, array,
    if 'DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT' enabled
  * [JACKSON-621] Add new fluent method, VisibilityChecker.with(Visibility)
   (suggested by Bruce P)
  * [JACKSON-638] TypeFactory methods for constructing "raw" map or collection types
   (suggested by Christopher C)
  * [JACKSON-639] Change BasicClassIntrospector.forClassAnnotations to take
    JavaType (not raw Class)
   (requested by Chris C)
  * [JACKSON-643] ObjectMapper.readValue() should check JsonDeserializer.getNullValue()
    when encountering root-level JsonToken.VALUE_NULL
  * [JACKSON-644] Add SimpleModule.setMixInAnnotations()
  * [JACKSON-648] ObjectWriter: allow changing default serialization DateFormat
    (ObjectMapper.writer(DateFormat), ObjectWriter.withDateFormat(DateFormat))
  * [JACKSON-650] Allow dealing with missing filter ids, by adding
    'SimpleFilterProvider.setFailOnUnknownId()' to specify if exception is thrown or not.
    (suggested by Kirill S)
  * [JACKSON-661] Add shorter 'JsonNode.asXxx' methods to replace 'JsonNode.getValueAsXxx'
  * [JACKSON-662] Add 'ObjectMapper.enable()' and 'ObjectMapper.disable()' to allow
    enabling/disabling multiple features with a single call.
  * [JACKSON-665] Add 'AnnotatedWithParams.getIndex()' for accessing index of a
    method or constructor parameter
   (requested by Chistropher C)
  * [JACKSON-671] Add convenience constructor for 'MinimalPrettyPrinter'
   (requested by David P)
  * [JACKSON-683] Mr Bean: Fail gracefully if attempt is made to materialize
    non-public type (since impl class on different package than base class)
  * [JACKSON-684] Add SerializationConfig.Feature.WRITE_ENUMS_USING_INDEX to serialize
    Enums as int (index)

  New features:

  * [JACKSON-132] Support "unwrapped" properties, using @JsonUnwrapped. 
  * [JACKSON-254] Add 'SerializationConfig.Feature.WRITE_EMPTY_JSON_ARRAYS',
    which can be used to suppress serialization of empty JSON arrays (unless
    overridden by per-property annotations).
   (suggested by Fabrice D)
  * [JACKSON-406] Allow injecting of values (with @JacksonInject) during deserialization
  * [JACKSON-453] Support "external type id" with new @JsonTypeInfo.As enum value,
    EXTERNAL_PROPERTY
  * [JACKSON-558] Add 'DeserializationConfig.Feature.UNWRAP_ROOT_VALUE' as
    matching counterpart for 'SerializationConfig.Feature.WRAP_ROOT_VALUE'
   (requested by Anand H)
  * [JACKSON-578] Allow use of @JsonView on JAX-RS resource, with JacksonJsonProvider
   (suggested by Matt G)
  * [JACKSON-580] Allow registering instantiators (ValueInstantiator) for types (classes)
  * [JACKSON-581] Add 'ObjectMapper.readTree(File)'
   (suggested by Pascal G)
  * [JACKSON-602] Add 'JsonSerialize.Inclusion.NON_EMPTY' option
   (suggested by Ed A)
  * [JACKSON-614] Add JsonTypeInfo.defaultImpl property to indicate type to use if type name missing
  * [JACKSON-630] Add @JsonRootName annotation for specifying name of root-level wrapper
   (requested by Lukasz Strzelecki)
  * [JACKSON-633] Add @JsonValueInstantiator to allow annotating which ValueInstantiator
   a type uses.
  * [JACKSON-652] Add 'DeserializationConfig.Feature.USE_JAVA_ARRAY_FOR_JSON_ARRAY' to
    allow mapping JSON Array to Object[]
   (suggested by Simone B)
  * [JACKSON-653] Add 'JsonParser.isNextTokenName()' for more efficient field name matching
  * [JACKSON-666] Add 'Add SerializationConfig.Feature.REQUIRE_SETTERS_FOR_GETTERS' to allow
    suppressing use of getters for which there is no matching mutator.
  
  Issues handled by new external projects:

  * [JACKSON-51]: Implement Just-In-Time code generation for serialization
    created "jackson-module-afterburner" at [https://github.com/FasterXML/jackson-module-afterburner]

  Potential backwards compatibility issues (compared to 1.8.x):

  * Removed 'org.codehaus.jackson.annotate.JsonClass, JsonKeyClass and
    JsonContentClass (deprecated since 1.1)
  * Move TokenBufferDeserializer to separate class (from inside StdDeserializer)

1.8.8 [20-Jan-2012]

  Fixes:

  * [JACKSON-701] ArrayIndexOutOfBoundsException when trying to serialize
    non-static inner classes with annotations on last ctor param
   (reported Lloyd S)
  * [JACKSON-741] Add missing linkage from ObjectMapper to JsonFactory
   by calling 'JsonFactory.setCodec()' from ObjectMapper constructor
  * [JACKSON-753] JsonParserDelegate missing delegation of getBooleanValue(),
    getEmbeddedObject()
   (reported by Sebastian T)
  * Partial fix for [JACSON-756]: EnumMap, EnumSet work with enums that use
   @JsonCreator; regular Maps only with 1.9
   (reported by Mika M)

1.8.7 [16-Dec-2011]

  Fixes:

  * [JACKSON-462] (REGRESSION?) Buffer overflow in Utf8Generator#writeFieldName(String)
   (reported by Ryan K)
  * [JACKSON-696] Problems accessing "any getter" that is not public
   (reported by Brian M)
  * [JACKSON-709] Problems converting base64-encoded Strings between
    JsonNode, POJOs
   (reported by Tom B)
  * [JACKSON-733] Smile-based mapper could not properly bind byte[] values
   (reported by Jacques-Olivier G)
  * [JACKSON-738] Parsing fails for Unicode 1Fxxx symbols when skipping
   (reported by Alex T)

1.8.6 [04-Oct-2011]

  Fixes:

  * [JACKSON-288] Problems (de)serializing values with JAXB adapters
  * [JACKSON-668] Problems with 'JsonParser.getDecimalValue' not
    clearing earlier state
   (reported by Ransom B)
  * [JACKSON-677] Inner generic type references not working properly
   (reported by William B)

1.8.5 [04-Aug-2011]

  Fixes:

  * [JACKSON-401] Further fixes to ensure FLUSH_PASSED_TO_STREAM works
  * [JACKSON-637] NumberSerializer was missing proper handling of Integer, Long
   (reported by Paul M)
  * [JACKSON-640] SmileParser.getTextCharacters() missing value in some
    cases (value back-references)
  * [JACKSON-647] ResolvableSerializer.resolve() not called after creating
    contextual instance

1.8.4 [25-Jul-2011]

  Fixes:

  * [JACKSON-605] Handle deserialization of Class<T> properties
  * [JACKSON-627] WriterBasedGenerator failure for long Strings,
    custom character escaping
    (reported by Lawrence C)
  * [JACKSON-629] Fix a	buffer boundary problem	with SmileParser, 5-7
    character names
    (reported by Maxxan)
  * [JACKSON-631] Problems decoding Base64Variants.MODIFIED_FOR_URL
    (reported by Tim B)
  * [JACKSON-632] Handling of UTF-8 BOM incorrect, causing "Internal Error"
    (reported by Edward A)

1.8.3 [08-Jul-2011]

  Fixes:

  * [JACKSON-587] TextNode.getValueAsLong() does not work properly
   (reported by Chris P)
  * [JACKSON-591] JodaDeserializers not throwing wrongTokenException
   (reported by Tom L)
  * [JACKSON-597] Make ClassDeserializer support primitive types
   (suggested by Bruce P)
  (plus all 1.7 fixes up to 1.7.8)

1.8.2 [15-Jun-2011]

  Fixes:

  * Problem with FilteredBeanPropertyWriter: was not delegating call
    to wrapped BeanPropertyWriter, causing problems with modules

1.8.1 [17-May-2011]

  Fixes:
  
  * [JACKSON-557] CollectionLikeType#equals() casts parameter to CollectionType
   (reported by Coda H)
  * [JACKSON-560] Mix-in annotations ignored when used with views
   (reported by Ruben E-G)
  * [JACKSON-568] Package 'org.codehaus.jackson.util' missing from
    core/lgpl jar
   (reported by Christoph S)
  * [JACKSON-570] Caching of MapSerializer not thread-safe
   (reported by Jamie R)
  * [JACKSON-573] Failure to serialize certain Unicode Strings
   (reported by Young J-P)
  (plus all 1.7 fixes up to 1.7.7)

1.8.0 [20-Apr-2011]

  Another minor release. Main improvements are:
  
  - Proper configurability for key serializers, deserializers
  - Ability to control details of low-level character escaping
  - Pluggable format auto-detection (for JSON and Smile in core packages)
  - Fully configurable type-defaulting (abstract-to-concrete) for deserialization
  - Pass-through FormatSchema abstraction to help support schema-based formats

  New features:
  
  * [JACKSON-43]: Add "ObjectMapper.readValues()", "ObjectReader.readValues()" for
    more convenient binding of arrays (and root-level sequences) of homogenous types
  * [JACKSON-102]: Ability to force escaping of non-ASCII characters; using
    JsonGenerator.Feature.ESCAPE_NON_ASCII and JsonGenerator.setHighestNonEscapedChar
  * [JACKSON-106]: Add 'org.codehaus.jackson.io.CharacterEscapes' which can be
    registered with JsonFactory, JsonGenerator, to add fully customized
    character escaping handling
    (suggested by Scott A)
  * [JACKSON-142]: Add 'JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS' to allow
    non-standard use of 'NaN', '+INF'/'+Infinite', '-INF'/'-Infinite' as numbers
  * [JACKSON-178]: Add support for custom property name strategies (with
    PropertyNamingStrategy)
  * [JACKSON-204]: Add DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
    to allow binding empty JSON String as null for POJOs
  * [JACKSON-358]: Add JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, to allow
    optional (and non-standard) support for numbers like 00006
    (suggested by Bryce M)
  * [JACKSON-427]: Added "JsonNode.with()" which is similar to "JsonNode.path()" but
    creates ObjectNode for property if no value exists (similar to "upsert" (update-or-insert))
  * [JACKSON-464]: Allow defining default mappings for abstract types, with
    SimpleAbstractTypeResolver
  * [JACKSON-494]: Add support for format auto-detection (via JsonFactory); add
    support for basic JSON, Smile (and as many modules as possible)
  * [JACKSON-512]: Allow wrapping InputStream/Reader, OutputStream/Writer when
    constructing JsonParser, JsonGenerator; JsonFactory allows registering
    InputDecorator, OutputDecorator instances.
  * [JACKSON-513]: Add methods for registering key serializers, deserializers,
    via Module API
  * [JACKSON-520]: Add minimal FormatSchema abstraction, passed through by ObjectMapper
    to JsonGenerator, JsonParser; needed for supporting schema-based formats.
  * [JACKSON-521]: Add support for new 'MapLikeType' and 'CollectionLikeType', to
    support Map/Collection types of languages like Scala
  * [JACKSON-523]: Allow passing actual type for TypeSerializer to use, to
    force specific super type to be used (instead of a concrete sub type)
  * [JACKSON-526]: Add DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY
    which allows implicit conversion from JSON scalars and Objects into single-element
    collections/arrays (for interoperability with XML-to-JSON converers like Jettison)
  * [JACKSON-527]: Add 'HandlerInstantiator' abstraction, which can be implemented and
    registered with ObjectMapper to get more control over how handlers (serializers,
    deserializers, type id resolver) are constructed.
    (requested by Sven J)
  * [JACKSON-555]: Add 'JsonParser.getInputSource()' and 'JsonGenerator.getOutputTarget()'
    to give direct access to low-level stream/reader/writer instances

  Improvements:

  * [JACKSON-480]: Added missing @JsonSerialize properties: keyAs, keyUsing,
    contentAs, contentUsing
  * [JACKSON-502]: Convert mr Bean functionality to be basic Module
  * [JACKSON-503]: Allow registering AbstractTypeResolvers via Module API
  * [JACKSON-519]: Add support for contextual key serializers, deserializers
  * [JACKSON-548]: enabling ALLOW_SINGLE_QUOTES should allow backslash-escaping
    of apostrophes
   (suggested by Tim W)
  * [JACKSON-551]: Add new methods to 'Serializers' and 'Deserializers' interfaces to
    support CollectionLikeType, MapLikeType.

  Fixes:

  * [JACKSON-459]: Add mapper-level configuration to set default serialization
    order be alphabetic (by property name).
   (suggested by Chris W)
  * [JACKSON-487]: Block all annotation access if SerializationConfig.Feature.USE_ANNOTATIONS
    (and ditto for DeserializationConfig) is disabled; to help with Android, missing JAXB annotations
  * [JACKSON-498]: Fix issues with type names, abstract types, collections
    (reported by John V)
  * [JACKSON-509] @JsonSubTypes was not allowed for fields/methods/ctor-parameters (although
    @JsonTypeInfo was, starting with 1.7)
  * [JACKSON-510] Registered subtypes not used for @JsonTypeInfo used with properties

  Potential backwards compatibility issues (compared to 1.7.x):

  * [JACKSON-523]: Added method "idFromValueAndType()" in TypeIdResolver interface,
    which is needed to properly handle types such as InetAddress, TimeZone -- unfortunately
    this would break custom TypeIdResolver instances.
  * [JACKSON-551]: Addition of new methods to 'Serializers' and 'Deserializers' interfaces
    means that existing code (1.7 only) that directly implements interfaces will not compile
    (i.e. source and binary incompatible change)

  Issues handled by new external projects:

  * [JACKSON-532]: Add support for org.json.JSONObject, org.json.JSONArray;
    created "jackson-module-json-org" at [https://github.com/FasterXML/jackson-module-json-org]

1.7.8 [08-Jul-2011]

  Fixes:

  * [JACKSON-586] Problems with @JsonValue, method access (failed on
    non-public methods, or public method of non-public class)
   (reported by Pierre-Alexander M)
  * [JACKSON-587] TextNode.getValueAsLong() does not work properly
    (reported by Chris P)
  * [JACKSON-591] JodaDeserializers not throwing wrongTokenException
   (reported by Tom L)
  * [JACKSON-597] Make ClassDeserializer support primitive types
   (suggested by Bruce P)

1.7.7 [17-May-2011]

  Fixes:

  * [JACKSON-542] Base64 decoder couldn't handle escaped characters
    (reported by Luis N)
  * [JACKSON-543] Root-level static type information incorrectly handled
    with Maps (losing parameterization)
   (reported by Steven S)
  * [JACKSON-553] SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION
    did not work correctly
   (reported by Xun W)
  * [JACKSON-554] ObjectMapper.readValue(JsonNode) was not properly passing
    itself as ObjectCodec, making secondary conversions fail
   (reported by Pascal G)
  * [JACKSON-556] @XmlElement.name property ignored in some cases
   (reported by Alex P)
  * [JACKSON-562] Smile property name decoding issue
   (reported by Jeffrey Damick, Shay Banon)
  * [JACKSON-563] JSON Schema uses "required" (not "optional")
   (reported by Oleg E)
  * [JACKSON-569] ContextualSerializer not resolved for serializers
    defined with @JsonSerialize annotation
    (reported by Gregor O)
  * [JACKSON-572] Problems serializing generic non-static inner classes
   (reported by Steven S)

1.7.6 [12-Apr-2011]

  Fixes:

  * [JACKSON-547] Problems relaying exceptions from creator methods
    (reported by Gili)
  * [JACKSON-550] Registration of serializers was not completely working
    with SimpleModule (interfaces implemented by superclasses skipped)
   (reported by Andrei P)
  * [JACKSON-552] SmileParser not handling long field names properly,
    failed with "this code path should never get executed" exception
   (reported by Shay B)

1.7.5 [01-Apr-2011]

  Fixes:

  * [JACKSON-530] Default SerializationInclusion value not properly
    passed when "USE_ANNOTATION" set to false
    (Suchema O)
  * [JACKSON-533] Failed to serialize LinkedHashMap.value()
    (reported by Linghu C)
  * [JACKSON-540] Side-effects with ObjectMapper.canSerialize(),
    canDeserialize()
    (reported by Maik J)
  * [JACKSON-541] Remove the need for @JsonCreator on multi-arg constructor
    iff all parameters have @JsonProperty
    (suggested by Pascal Glinas)
  * [JACKSON-545] UTF8Writer.flush() should check against NPE
    (reported by Michel G)

1.7.4 [04-Mar-2011]

  Fixes:

  * [JACKSON-484]: improve serialization of InetAddress
   (reported by Brian H)
  * [JACKSON-506]: problems with type handling for java.util.Date
    when using @JsonTypeInfo on field/method
   (reported by Kirill S)
  * [JACKSON-504]: FilterProvider registration directly via SerializationConfig
    was not working
   (reported by Kirill S)
  * [JACKSON-508]: Type information lost when serializing List<List<X>>
   (reported by Christopher B)
  * [JACKSON-518]: Problems with JAX-RS, type variables 
   (reported by   Kirill S)
  * [JACKSON-522]: java.util.TimeZone was not correctly handled
  * [JACKSON-525]: Problem with SmileGenerator, shared-names buffer recycling
   (reported by Shay B)

1.7.3 [14-Feb-2011]

  Fixes:

  * [JACKSON-483]: allow deserializing CharSequence (also: support
    conversion from byte[] to char[], assuming base64 encoding)
  * [JACKSON-492]: problem encoding 1 byte length "raw" UTF8 Strings
    (reported by David Y)

  (plus all fixes up to and including 1.6.6)

1.7.2 [02-Feb-2011]

  Fixes:

  * [JACKSON-476] ContextualDeserializer handling not completely working
   (reported by Sean P)
  * [JACKSON-481] OSGi headers must include 1.5 AND 1.6
   (reported by drozzy@gmail.com)

  (plus all fixes up to and including 1.6.5)

  Improvements:

  * [JACKSON-474] Add ability to pass externally allocated buffer
    for Utf8Generator, SmileGenerator
   (suggested by David Y)

1.7.1 [12-Jan-2010]

  Fixes:
  
  * [JACKSON-456]: Type check issues with Jackson JAX-RS provider
   (reported by Kirill S)
  * [JACKSON-457]: Typo in Module method "getSeserializationConfig" ("bananana error"); renamed
    as "getSerializationConfig" (version with old spelling retained as deprecated for compatibility)
   (reported by Chris W)
  * [JACKSON-458]: Problems with ObjectMapper.convertValue(), TokenBuffer, SerializedString
   (reported by Larry Y)
  * [JACKSON-462]: Buffer overflow in Utf8Generator#writeFieldName(String)
   (reported by Coda H)

1.7.0 [06-Jan-2010]

  Fixes:

  * [JACKSON-356]: Type information not written for nested-generics root types
    (reported by Alex R on mailing list)
  * [JACKSON-450] JAXB annotations chosen incorrectly from interface method
    (instead of method definition in class), when serializing
    (reported by Sean P)

  Improvements:

  * [JACKSON-280]: Allow use of @JsonTypeInfo for properties (fields, methods)
  * [JACKSON-345]: Make BeanSerializer use SerializedString for even faster serialization
  * [JACKSON-393]: Allow deserializing UUIDs from VALUE_EMBEDDED_OBJECT
  * [JACKSON-399]: JAX-RS is not passing generic type information as root type
    (reported by Kirill S) 
  * [JACKSON-409] Add SmileGenerator.writeRaw(byte)
  * [JACKSON-414] Add 'JsonNode.getValueAsBoolean()' (and 'JsonParser.getValueAsBoolean()')
   (suggested by Tauren M)
  * [JACKSON-419]: Add explicit support for handling 'java.util.Locale'
    (suggested by Brian R)
  * [JACKSON-432]: Add 'ObjectMapper.enableDefaultTypingAsProperty()' to allow
    specifying inclusion type 'As.PROPERTY' and property name to use
    (suggested by Peter L)
  * [JACKSON-434]: Add 'JsonGenerator.writeString(SerializableString)'
  * [JACKSON-438]: Wrap exceptions thrown by Creator methods as JsonMappingException
    (suggested by Tim W)

  New features:

  * [JACKSON-163] Add 'SerializationConfig.Feature.WRAP_ROOT_VALUE' which
    allows wrapping of output within single-property JSON Object.
  * [JACKSON-297] Add simple Module abstraction to allow pluggable support
    tor third-party libraries, data types
  * [JACKSON-312] Add ability to dynamically filter out serialized properties
  * [JACKSON-351]: Add @JsonRawValue for injecting literal textual
    value into JSON
   (contributed by Ga�l Marziou)
  * [JACKSON-369]: Allow registering custom Collection and Map deserializers
   (implemented via 'org.codehaus.jackson.map.Deserializers')
  * [JACKSON-385]: Support contextual serializers, deserializers; works by
    implementing 'org.codehaus.jackson.map.ser.ContextualSerializer' or
    'org.codehaus.jackson.map.deser.ContextualDeserializer'
  * [JACKSON-401] Add features 'SerializationConfig.FLUSH_AFTER_WRITE_VALUE'
    and 'JsonGenerator.FLUSH_PASSED_TO_STREAM' to allow blocking of flush()
    calls to underlying output stream or writer
  * [JACKSON-405]: Add command-line tool for manual Smile encoding/decoding
  * [JACKSON-407]: Add features (SerializationConfig.Feature.WRAP_EXCEPTIONS,
    DeserializationConfig.Feature.WRAP_EXCEPTIONS) to disable exception wrapping
  * [JACKSON-412] Add 'DeserializationConfig.Feature.FAIL_ON_NUMBERS_FOR_ENUMS'
    to optionally prevent mapping JSON integers into Java Enum values
   (suggested by Patrick L)
  * [JACKSON-420] Add 'DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES'
    to optionally prevent JSON null from mapping to default value
   (suggested by Thomas D)
  * [JACKSON-421] Add ability to register multiple sets of serializers
    without extending SerializerFactory (related to [JACKSON-297])
  * [JACKSON-429] Add @JsonIgnoreType to allow ignoring any and all properties
    of specified type; useful to exclude well-known proxy/facade/handler types
  * [JACKSON-440] Add ability to process serializers, deserializers during their
    construction (to allow adding, removing, modifying properties to handle)
  * [JACKSON-448] Add 'JsonGenerator.writeString()' alternatives that accept
    pre-encoded UTF-8 byte sequences (writeUTF8String() and writeRawUTF8String())
   (requested by Shay B)

  Issues handled by new external projects:

  * [JACKSON-317] Add support for Guava (ex-Google-collections); implemented
    as a new module, see: https://github.com/FasterXML/jackson-module-guava
  * [JACKSON-394] Add support for using data binding to/from XML (Stax) sources;
    sort of "mini-JAXB".

  Potential backwards compatibility issues (compared to 1.6.x):

  * [JACKSON-419] (see above) 'java.util.Locale' now serialized as JSON String
    (using Locale.toString()), instead of as bean-like JSON Object
  * Added 'BeanProperty' argument for many methods in SerializerFactory /
    DeserializerFactory, SerializerProvider / DeserializerProvider implementations.
  * Related to [JACKSON-407], will wrap some previously unwrapped exceptions from
    deserializer (to have symmetric handling; serializer already wrapped); new
    features to allow disabling wrapping on serialization and/or deserialization.

1.6.5 [01-Feb-2011]

  Fixes:

  * [JACKSON-454] JSON Schema generator was adding bogus "items" property
    for JSON object types (only allowed for arrays)
  * [JACKSON-461] ArrayIndexOutOfBoundsException when property is subclass of
    Map with fewer type parameters
   (reported by Tim W)
  * [JACKSON-465] Deserialization with @JsonCreator that takes in a Map fails
   (reported by Tim W)
  * [JACKSON-468] Method-bound type variables (public <T> T getValue()) not handled
    (reported by Christian N)
  * [JACKSON-470] ArrayIndexOutOfBoundsException if @JsonCreator constructor
    has @JsonParameter parameters with same name
   (reported by Tim W)
  * [JACKSON-472] Custom bean deserializers are not cached when using
    JAXB annotation introspector
   (reported by Seam P)
  * [JACKSON-473] JsonMapping$Reference not Serializable
    (reported by Steven S)
  * [JACKSON-478] Improve support for 'java.sql.Timestamp' type by allowing
    deserializing textual representations
    (reported by John L)

1.6.4 [21-Dec-2010]

  Fixes:

  * [JACKSON-364] @JsonTypeInfo not included properly for Collection types
    when using JsonView functionality
  * [JACKSON-428] Type information, Map key deserializer definitions don't
    work together
    (reported by Patrick R)
  * [JACKSON-431] Deserialization fails with JSON array with beans with
    @JsonCreator, unmapped properties before and after creator properties
   (reported by Hannu L)
  * [JACKSON-436] @XmlElementType not working correctly with Collection type
    properties
   (reported by Sean P)

1.6.3 [04-Dec-2010]

  Fixes:

  * [JACKSON-228], [JACKSON-411] XmlJavaTypeAdapter, package-level annotations not
    working
   (reported by Claudio R, Raymond F)
  * [JACKSON-387]: Deserialization fails for certain objects serialized with
    enableDefaultTyping
   (reported by Peter L)
  * [JACKSON-415] XMLElement annotation ignored during schema generation
    (reported by Sean P)
  * [JACKSON-416] XmlElement.type() doesn't override type during serialization
    (reported by Sean P)
  * [JACKSON-417] Deserialization of "native" types (String, Integer, Boolean)
    failed with abstract types
   (reported by Joe J)
  * [JACKSON-423] Incorrect serialization of BigDecimal, BigInteger,
    when using TokenBuffer
   (reported by Sean P)
  * [JACKSON-424] ArrayIndexOutOfBounds with SmileGenerator, long Unicode
    Strings
   (reported by Shay B)

1.6.2 [02-Nov-2010]

  Fixes:

  * [JACKSON-288] Problems with JAXB annotation handling for combination of
   @XmlJavaTypeAdapter, @XmlElement
    (reported by Kent R)
  * [JACKSON-366] Type metadata not written for empty beans
   (reported by Patrick R)
  * [JACKSON-388] Deserialization of Throwable fails with Inclusion.NON_NULL
   (reported by Kirill S)
  * [JACKSON-391] ObjectReader.withValueUpdate() passing wrong object
   (reported by Kurtis)
  * [JACKSON-392] Beans with only @JsonAnyGetter fail on serialization
   (reported by Kirill S)
  * [JACKSON-395]: JsonParser.getCurrentName() not working with
    JsonParser.nextValue() for nested JSON Arrays, Objects
  * [JACKSON-397] Reverted most of [JACKSON-371] from 1.6 branch, since it caused
    externally visible change in exception handling; behavior now back to 1.6.0
    (will change to catch and rethrow in 1.7.0)
   (reported by Jon Berg)
  * [JACKSON-398]: Root type information not correctly passed by
    ObjectWriter when using JsonGenerator
    (reported by Kirill S)
  * [JACKSON-403]: XMLGregorianCalendar could not be deserialized from timestamp
    (reported by Manual F)
  * [JACKSON-404] Problem with XmlAdapter, generic types, deserialization
    (reported by Davide)

1.6.1 [06-Oct-2010]

  Fixes:

  * [JACKSON-359] TypeIdResolver.init() was not being called properly
    (reported by Peter L)
  * [JACKSON-372] handle missing primitive type values for @JsonCreator gracefully (with defaults)
  * [JACKSON-376] writing binary data as object field value with Smile failed
    (reported by Shay B)
  * [JACKSON-371] Provide path of type error in ObjectMapper.convertValue()
    (reported by Larry Y)
  * [JACKSON-383] @JsonAnySetter gets called for ignorable properties if
    FAIL_ON_UNKNOWN_PROPERTIES set to false (related to [JACKSON-313])
    (reported by Kirill S)
  * [JACKSON-384] @JsonAnyGetter values were duplicated if method name was valid as a regular
    getter name
    (reported by Bruce R)
  * all fixes from 1.5.x up to 1.5.7

  Improvements:

   * [JACKSON-360] Convert empty String to null values for Joda
     (suggested by Shilpa P)
   * [JACKSON-386] Improve registration for optional/external types (javax.xml, joda)

1.6.0 [06-Sep-2010]

  Fixes:

  * [JACKSON-265] Problems with generic wildcard type, type info
   (reported by Fabrice D)
  * [JACKSON-268] Property ordering for JAXB did not work with "raw" property
    names (but just with renamed names like with Jackson annotations)
   (reported by Valentin B)
  * [JACKSON-303] JAXB annotation @XmlAccessorType(XmlAccessType.NONE) seems
    to not work correctly during deserialisation process
    (reported by David M)
  * [JACKSON-313] Ignorable properties should not be passed to any-setter
  * [JACKSON-336] Generics handling: Map type not handled if intermediate types
    with just one generic parameter

  Improvements:

  * [JACKSON-193] @JsonCreator-annotated factory methods and @JsonValue annotated
    output methods now work with enums, allowing more customizable enum ser/deser.
    (requested by Paul B)
  * [JACKSON-253] Support combination of @XmlAnyElement + @XmlElementRefs
  * [JACKSON-261] @JsonView now implies that associated element (field,
    getter/setter) is to be considered a property; similar to how
    @JsonSerialize/@JsonDeserialize/@JsonProperty are used.
  * [JACKSON-274] Un-deprecated @JsonGetter and @JsonSetter.
  * [JACKSON-283] JDK atomic types (java.util.concurrent.atomic) supported
  * [JACKSON-289] Added "SerializationConfig.Feature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS"
    to allow serializing char[]s as JSON Arrays with single-char-String values
    (also fixed issues with deserializing the same on deserializer side)
    (requested by Brian O)
  * [JACKSON-290] @JsonWriteNullProperties can be used with fields too;
    annotation itself is now deprecated (use JsonSerialize#include instead).
  * [JACKSON-301] Allow JsonMappingException to return name of "bad" (unrecognized)
    field
    (requested by Rob O)
  * [JACKSON-302] Add JsonNode.has(String/int) to allow for more convenient checking
    of whether JSON Object/Array nodes have specified value.
  * [JACKSON-308] Configurable date formatting support for XMLGregorianCalendar:
    XMLGregorianCalendar now uses same Date/Calendar serialization as other date types.
    (suggested by Igor K)
  * [JACKSON-321] Allow passing JsonNodeFactory to use for ObjectMapper, ObjectReader,
    to allow use of custom JsonNode types.
  * [JACKSON-326] Add 'JsonParser.hasTextCharacters()' to make it easier to optimize
    text access (esp. when copying events)
  * [JACKSON-328] Precedence of "getters-as-setters" (for Maps, Collections) was
    accidentally higher than that of property fields (public, @JsonProperty)
    (reported by Thomas D)
  * [JACKSON-333] Add JsonNode.getValueAsInt()/.getValueAsDouble() for more convenient
     coercion; including parsing of JSON text values to numbers if necessary
  * [JACKSON-339] Support Joda ReadableDateTime, ReadableInstant out of the box
  * [JACKSON-349] Accept empty String as number (null for wrappers, 0 for primitives)

  New features:

  * [JACKSON-41] Add code generation to allow deserialization into arbitrary Bean interfaces.     
  * [JACKSON-210] Add method(s) in JsonNode for finding values of named property
  * [JACKSON-212] Allow serializer/deserializing Enums using toString() method
    instead name()
  * [JACKSON-235] Handle bi-directional (parent/child, double-linked lists) references
  * [JACKSON-257] Add ability to register sub-types for Polymetric Type Handling
  * [JACKSON-264] Ability to "update" values; to read and bind JSON
    content as properties of existing beans. This is done by using
    "ObjectMapper.updatingReader()" (and "reader.readValue(source)")
  * [JACKSON-267] Allow unquoted field names to start with '@' in
    (when unquoted name support is enabled, to support polymorphic
    typing (which defaults to property names like "@class").
   (requested by Michel G)
  * [JACKSON-278] Allow access to version information (via new Versioned interface)
   (requested by Andrei V)
  * [JACKSON-282] Added SerializationConfig.Feature.CLOSE_CLOSEABLE
    which when enabled forced a call to value.close() right after
    serialization of a (root-level) value.
  * [JACKSON-287] Add JsonParser.releaseBufferedContent() which can be called
    to "push back" content read but not (yet) consumed by JsonParser
  * [JACKSON-292] Add "any-getter" (using @JsonAnyGetter) to complement @JsonAnySetter,
    more convenient mapping of miscellaneous extra properties.
  * [JACKSON-295] Add 'jackson-all' jar
    (suggested by Ant E)
  * [JACKSON-299] Added 'org.codehaus.jackson.impl.MinimalPrettyPrinter'
    to make it easier to add simple output customizations
    (suggested by David P)
  * [JACKSON-300] Add 'JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER
    to allow non-standard character escapes like \'.
    (requested by Ketan G)
  * [JACKSON-314] (go Pi, go!) Add 'SerializationConfig.Feature.WRITE_NULL_MAP_VALUES'
    to suppress writing of Map entries with null values.
  * [JACKSON-316] Allow per-call enable/disable of pretty printing (added
    methods in ObjectWriter; .withPrettyPrinter())
  * [JACKSON-325] Add new Jackson "internal" annotation (@JacksonStdCodec?) to allow
    marking default/standard serializers, deserializers
  * [JACKSON-337] Add "ObjectMapper.valueToTree()"
  
  Backwards incompatible changes

  * [JACKSON-328] (see above) fixes precedence of "getter-as-setter" (for Maps, Collections)
    to be LOWER than that of fields; this is the original intended behavior. However,
    versions 1.1 - 1.5 accidentally had fields at lower precedence. This fix can
    change behavior of code.
  * [JACKSON-308] (see above) Configurable date formatting support for XMLGregorianCalendar:
    since default Date/Calendar formatting uses timestamp instead of textual serialization,
    default XMLGregorianCalendar serialization is changing.

1.5.7 [03-Oct-2010]

  Fixes:

  * [JACKSON-352] Polymorphic deserialization for Object always assumes
    array-wrapper style
   (reported by Henry L)
  * [JACKSON-355] Handling of BigInteger with JsonNode not correct
   (reported by Adam S)
  * [JACKSON-363] CustomDeserializerFactory did not work for custom
    array deserializers.
   (reported by Lubomir K)
  * [JACKSON-370] TreeTraversingParser.skipChildren() not working correctly
   (reported by Dmitry L)
  * [JACKSON-373] Interface inheritance not traversed when looking up
    custom serializers
   (reported by Lubomir K)
  * [JACKSON-377] ThrowableDeserializer was not properly using information from
    @JsonCreator or @JsonAnySetter
   (reported by Kirill S)
  * [JACKSON-380] Incorrect type information serialized for some Enums
  
1.5.6 [17-Aug-2010]

  Fixes:

  * [JACKSON-329] type information was not properly serialized for
    Iterator or Iterable serializers
   (reported by Yuanchen Z)
  * [JACKSON-330] ObjectMapper.convertValue(): base64 conversions
    do not work as expected
  * [JACKSON-334] Support ISO-8601 date without milliseconds
  * [JACKSON-340] Meta annotations missing for @JsonTypeResolver
   (reported by Yuanchen Z)
  * [JACKSON-341] Issue with static typing, array and subtyping
    (reported by Yuanchen Z)

1.5.5 [25-Jul-2010]

  Fixes:

  * [JACKSON-309] Serialization of null properties not working correctly
    when using JAXB annotation introspector
  * [JACKSON-318] Deserializer missing support for java.util.Currency
    (reported by Geoffrey A)
  * [JACKSON-319] Issues when trying to deserialize polymorphic type
    with no data (just type information)
    (reported by Chris C)
  * [JACKSON-324] JsonParserBase: call releaseBuffers() in finally
    block (within close())
    (suggested by Steve C)
  * [JACKSON-327] CustomSerializerFactory had a bug in handling of
    interface registrations
    (reported by Yuanchen Z)

  (and all fixes from 1.4.x branch up to 1.4.5)

1.5.4 [25-Jun-2010]

  Fixes:

  * [JACKSON-296]: Add support for JAXB/@XmlElementRef(s), fix related
    issues uncovered (wrt. handling of polymorphic collection fields)
   (reported by Ryan H)
  * [JACKSON-311]: Problems handling polymorphic type information for
    'untyped' (Object) bean properties, default typing
   (reported by Eric S)

1.5.3 [31-May-2010]

  Fixes:

  * [JACKSON-285]: Problem with @JsonCreator annotated constructor that
    also uses @JsonDeserialize annotations

  Improvements:

  * [JACKSON-284]: Reduce scope of sync block in
    SerializerCache.getReadOnlyLookupMap()
  * Partial fix for [JACKSON-289]: allow JSON Array with single-character
    Strings to be bound to char[] during deserialization
   (suggested by Brian O)

1.5.2 [25-Apr-2010]

  Fixes:

  * [JACKSON-273] Yet another OSGi issue, "org.codehaus.jackson.map.util"
    not exported by mapper module, needed by jax-rs module.
   (reported by Lukasz D)
  * [JACKSON-281] JsonGenerator.writeObject() only supports subset of
    wrapper types (when not specifying ObjectCodec)
   (reported by Aron A)

  (and all fixes from 1.4.x branch up to 1.4.4)

1.5.1 [09-Apr-2010]

  Fixes:

  * [JACKSON-265]: problems with generic type handling for serialization
    (reported by Fabrice D)
  * [JACKSON-269]: missing OSGi export by mapper (o.c.j.m.jsontype.impl),
    needed by jackson-xc module
    (reported by Raymond F)

  (and all fixes from 1.4.x branch up to 1.4.3)


1.5.0 [14-Mar-2010]

  Fixes:

  * [JACKSON-246] JAXB property name determination not working correctly.
    (reported by Lars C)

  Improvements:

  * [JACKSON-160] Factory Creator methods now handle polymorphic
    construction correctly, allowing manual polymorphic deserialization
  * [JACKSON-218] Extended support for Joda date/time types like
    LocalDate, LocalDateTime and DateMidnight
  * [JACKSON-220] @JsonSerialize.using() was not working properly for
    non-Bean types (Collections, Maps, wrappers)
  * [JACKSON-236] Allow deserialization of timestamps-as-Strings (not
    just timestamps as JSON integer numbers).
   (requested by Chris C)
  * [JACKSON-255] Allow setter override even with incompatible type
    (as long as only one setter per class, so there is no ambiguity)
  * [JACKSON-256] AnnotationIntrospector.findSerializationInclusion
    was not combining values correctly for JAXB annotations.
   (reported by John L)

  New features:

  * [JACKSON-91] Polymorphic Type Handling: automatic handling of
    polymorphic types, based on annotations (@JsonTypeInfo) and/or
    global settings (ObjectMapper.enableDefaultTyping()) 
  * [JACKSON-175] Add "org.codehaus.jackson.util.TokenBuffer", used for
    much more efficient type conversions (and other internal buffering)
  * [JACKSON-195] Add methods to ObjectMapper to allow specification of
    root object serialization type.
  * [JACKSON-221] Add 'ObjectMapper.writeValueAsBytes()' convenience
    method to simplify a common usage pattern
  * [JACKSON-229] TypeFactory should have methods to construct parametric
     types programmatically (TypeFactory.parametricType())
  * [JACKSON-232] Add 'SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION'
    to disable inclusion of non-annotated properties with explicit views
    (suggested by Andrei V)
  * [JACKSON-234] Add support for JSONP, by adding JSONPObject wrapper
    that serializes as expected.
  * [JACKSON-241] Add a mechanism for adding new "untouchable" types for
    JAX-RS JSON provider, to allow excluding types from being handled
    (added method "JacksonJsonProvider.addUntouchable()")
  * [JACKSON-244] Allow specifying specific minimum visibility levels for
    auto-detecting getters, setters, fields and creators
    (requested by Pierre-Yves R)
  * [JACKSON-245] Add configuration setting in JAX-RS provider to allow
    automatic JSONP wrapping (provider.setJSONPFunctionName())
  * [JACKSON-259] Add JsonParser.Feature to allow disabling field name
    canonicalization (JsonParser.Feature.CANONICALIZE_FIELD_NAMES)

  Backwards incompatible changes:

  * Moved following serializers out of BasicSerializerFactory
    JdkSerializers: ClassSerializer (into JdkSerializers),
    NullSerializer (separate class)
  * Add one parameter to StdDeserializer.handleUnknownProperty:
    addition was required for handling polymorphic cases that
    can use nested JsonParser instances.
  * Fixed issues in generic type handling (was not resolving all named
    types completely)
  * Annotation changes:
     * Moved "NoClass" into "org.codehaus.jackson.map.annotate" package
     * Removed @JsonUseSerializer and @JsonUseDeserializer annotations
       (which has been deprecated for 1.1; replaced by
       @JsonSerialize.using and @JsonDeserialize.using, respectively)
     * @JsonGetter and @JsonSetter are marked as deprecated, since
       @JsonProperty can (and should) be used instead.

1.4.4 [25-Apr-2010]

  Fixes:

  * [JACKSON-263] BooleanNode.asToken() incorrectly returns 'true' token
    for all nodes (not just 'false' ones)
   (reported by Gennadiy S)
  * [JACKSON-266] Deserialization issues when binding data from JsonNode
   (reported by Martin T)

1.4.3 [18-Feb-2010]

  Fixes:

 * [JACKSON-237]: NPE in deserialization due to race condition
   (reported by Benjamin D)


1.4.2 [31-Jan-2010]

  Fixes:

  * [JACKSON-238]: Fix to ensure custom serializers can override
    default serializers (like DOM, Joda serializers)
   (reported by Pablo L)
  * other fixes from 1.3.4 release

1.4.1 [10-Jan-2010]

  Fixes:

   fixes from 1.3.x branch up to 1.3.3.

1.4.0 [19-Dec-2009]

  Improvements:

  * [JACKSON-38] Allow serializing/deserializing DOM trees (Node, Document)
    (suggested by Scott D)
  * [JACKSON-89] Make ignored field/creator-backed properties quietly
    skippable during deserialization (that is, without having to explicitly
    declare such properties as ignorable as per [JACKSON-77])
  * [JACKSON-161] Added basic support for Joda, ser/deser DateTime class
  * [JACKSON-170] Serialize Creator properties before other properties
  * [JACKSON-196] Schema generation does not respect the annotation
    configured serializer on a bean property
   (reported by Gil M)
  * [JACKSON-208] Add feature (JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS)
    to allow unquoted control characters (esp. tabs) in Strings and
    field names
   (requested by Mark S)
  * [JACKSON-216] Jackson JAXB annotation handler does not use @XmlElement.type
    property for figuring out actual type
   (reported by Mike R)

  New features:

  * [JACKSON-77] Add class annotation @JsonIgnoreProperties to allow
    for ignoring specific set of properties for serialization/deserialization
  * [JACKSON-90] Added @JsonPropertyOrder, which allows for specifying
    order in which properties are serialized.
  * [JACKSON-138] Implement JsonView; ability to suppress subsets of
    properties, based on view definition. Views are defined using @JsonView
    annotation.
  * [JACKSON-191] Add access to basic statistics on number of cached
    serializers, deserializers (and methods to flush these caches)
  * [JACKSON-192] Added basic delegate implementations (JsonParserDelegate,
    JsonGeneratorDelegate) to make it easier to override core parser and
    generate behavior
  * [JACKSON-201] Allow serialization of "empty beans" (classes without
    getters), if SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS is
    disabled; or if class has recognized Jackson annotation
   (suggested by Mike P)

  Other:

  * Removed "BasicSerializerFactory.StringLikeSerializer" that was
    deprecated for 1.0, replaced by public "ToStringSerializer"

1.3.4 [31-Jan-2010]

  Fixes:

  * [JACKSON-225], [JACKSON-227], missing null checks/conversions when
    adding entries to ArrayNode and ObjectNode
   (reported by Kenny M)
  * [JACKSON-230]: wrong NumberType reported for big ints, longs
   (reported by Henning S)
  * [JACKSON-231]: ArrayDeserializer for byte[] should be able to
    use VALUE_EMBEDDED_OBJECT (if Object is byte[])

1.3.3 [21-Dec-2009]

  Fixes:

  * [JACKSON-214] Enum types with sub-classes failed to serialize
    (reported by Elliot S)
  * [JACKSON-215] Add JAX-RS provider annotations on JacksonJaxbJsonProvider
    (suggested by Matthew R)
  * [JACKSON-220] JsonSerialize.using() not recognized for Collection and
    Map types (and similarly for JsonDeserialize)

1.3.2 [02-Dec-2009]

  Fixes:

  * [JACKSON-103] (additional work) Groovy setMetaClass() setter caused
    problems when deserializing (although serialization was fixed earlier)
   (reported by Stephen F)
  * [JACKSON-187] Issues with GAE security model, Class.getEnclosingMethod()
  * [JACKSON-188] Jackson not working on Google App Engine (GAE) due to
    unintended dependency from JacksonJsonProvider to JAXB API classes
   (reported by Jeff S)
  * [JACKSON-206] Support parsing dates of form "1984-11-13T00:00:00"

1.3.1 [23-Nov-2009]

  Fixes:

  * [JACKSON-190] Problems deserializing certain nested generic types
   (reported by Nathan C)
  * [JACKSON-194] ObjectMapper class loading issues on Android
   (reported by Martin L)
  * [JACKSON-197] Remove 2 debug messages that print out to System.err
   (reported by Edward T)
  * [JACKSON-200] java.sql.Date deserialization not working well
   (reported by Steve L)
  * [JACKSON-202] Non-public fields not deserialized properly with
    JAXB annotations
   (reported by Mike P)
  * [JACKSON-203] Date deserializers should map empty String to null
   (reported by Steve L)

1.3.0 [30-Oct-2009]

  Fixes:

  * [JACKSON-150] Some JAXB-required core types (XMLGregorianCalendar,
    Duration, QName, DataHandler) were not completely supported
  * [JACKSON-155] Failed to serialize java.io.File (with infinite
    recursion)
   (reported by Gabe S)
  * [JACKSON-167] Map and Collection sub-classes seem to lose generic
    information for deserialization
  * [JACKSON-177] Problems with Hibernate, repackaged cglib
    (reported by Ted B)
  * [JACKSON-179] Single-long-arg factory Creators were not working
   (reported by Brian M)
  * [JACKSON-183] Root-level 'JsonDeserialize' annotation was not handled
    completely; 'as' setting was not taking effect
   (reported by Nick P)

  Improvements:

  * [JACKSON-152] Add "ObjectMapper.writeValueAsString()" convenience
    method to simplify serializing JSON into String.
  * [JACKSON-153] Allow use of @JsonCreator with Map types too
  * [JACKSON-158] Bean serializer now checks for direct self-references
    (partial, trivial cycle detection)
  * [JACKSON-164] Improve null handling for JsonGenerator.writeStringValue
   (suggested by Benjamin Darfler)
  * [JACKSON-165] Add JsonParser.getBooleanValue() convenience method
    (suggested by Benjamin Darfler)
  * [JACKSON-166] Add ability to control auto-detection of
    "is getters" (boolean isXxx()) methods separate from regular getters
  * [JACKSON-168] Make JsonLocation serializable (and deserializable)
   (suggested by Shay B)
  * [JACKSON-182] Improved handling of SerializationConfig.AUTO_DETECT_GETTERS
    with JAXB annotations (uses Jackson-specified default, not JAXB defaults)

  New features:

  * [JACKSON-129] Allow constructing JsonParser to read from JsonNode
    (tree representation)
  * [JACKSON-154] Added JsonDeserialize.keyUsing and .contentUsing,
    to allow for overriding key and content/value deserializers for
    properties of structured (array, Collection, Map) types
  * [JACKSON-159] Added 'org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider'
    to improve use of Jackson as JSON converter for JAX-RS services.
  * [JACKSON-173] Add "JsonParser.Feature.ALLOW_SINGLE_QUOTES" to
    handle some more invalid JSON content
   (requested by Brian M)
  * [JACKSON-174] Add "ObjectMapper.convertValue()" convenience method
    for simple Object-to-Object conversions, using Jackson's data binding
    functionality
  * [JACKSON-176] Added 'JsonGenerator.Feature.WRITE_NUMBER_AS_STRINGS'
    as a work-around for Javascript problems with big longs (due to
    always representing numbers as 64-bit doubles internally)
    (requested by Doug D)
  * [JACKSON-180] Added 'JsonParser.Feature.INTERN_FIELD_NAMES' to allow
    disabling field name intern()ing.
   (suggested by Jeff Y)
  * [JACKSON-181] Added convenience methods in TypeFactory to allow
    dynamically constructed fully typed structured types (map, collection
    array types), similar to using TypeReference but without inner classes
  * Added method in AnnotationIntrospector to find declared namespace
    for JAXB annotations, needed for XML compatibility (future features)

  Other:

  * Removed obsolete class 'org.codehaus.jackson.map.type.TypeReference'
    (obsoleted by 'org.codehaus.jackson.type.TypeReference) -- was supposed
    to have been removed by 1.0 but had not been.
  * Added support to handle 'java.util.regex.Pattern'

1.2.1 [03-Oct-2009]

  Problems fixed:

  * [JACKSON-162] OSGi packaging problems for xc package.
   (reported by Troy Waldrep)
  * [JACKSON-171] Self-referential types cause infinite recursion when
    using only JAXB annotation introspector
    (reported by Randy L)

1.2.0 [02-Aug-2009]

  Improvements:

  * Added "-use" flag for generating javadocs
   (suggested by Dain S)
  * [JACKSON-136] JsonParser and JsonGenerator should implement
    java.io.Closeable (since they already have close() method)
   (suggested by Dain S)
  * [JACKSON-148] Changed configuration methods to allow chaining,
    by returning 'this' (instead of 'void')

  New features:

  * [JACKSON-33] Allow use of "non-default constructors" and
    multiple-argument factory methods for constructing beans to
    deserialize
  * [JACKSON-69] Support parsing non-standard JSON where Object keys are not quoted
  * [JACKSON-76] Mix-in annotations: allow dynamic attachment of
    annotations to existing classes, for purposes of configuring
    serialization/deserialization behavior
  * [JACKSON-92] Allow use of @JsonCreator for constructors and
    static methods that take a single deserializable type as argument
    (so-called delegating creators)
  * [JACKSON-114] Add feature and annotations to make serialization use
    static (declared) type over concrete (actual/runtime) type
  * [JACKSON-131] Allow constructing and passing of non-shared
    SerializationConfig/DeserializationConfig instances to ObjectMapper
  * [JACKSON-135] Add basic JsonNode construction support in ObjectMapper
  * [JACKSON-147] Add global deserialization feature for suppressing error
    reporting for unknown properties
  * [JACKSON-149] Add ser/deser features
    (DeserializationConfig.Feature.USE_ANNOTATIONS,
    SerializationConfig.Feature.USE_ANNOTATIONS) to allow disabling
    use of annotations for serialization and/or deserialization config

1.1.2 [31-Jul-2009]

  Fixes:

  * [JACKSON-143] NPE on ArrayNode.equals() when comparing empty array
    node to non-empty array node
   (reported by Gregory G)
  * [JACKSON-144] Static "getter-like" methods mistaken for getters (for
    serialization)
   (reported by Dan S)

1.1.1 [18-Jul-2009]

  Fixes:

  * [JACKSON-139] Non-numeric double values (NaN, Infinity) are serialized
    as invalid JSON tokens
    (reported by Peter H)
  * Core jar incorrectly included much of "mapper" classes (in addition
    to core classes)
  * Now compiles again using JDK 1.5 javac (1.1.0 didn't)

1.1.0 [22-Jun-2009]

  Fixes:

  * [JACKSON-109] Allow deserializing into generics Bean classes
    (like Wrapper<Bean>) not just generic Maps and Collections 
  * [JACKSON-121] Problems deserializing Date values of some ISO-8601
    variants (like one using 'Z' to indicate GMT timezone)
  * [JACKSON-122] Annotated serializers and deserializers had to
    be public classes with public default constructor; not any more.

  Improvements:

  * [JACKSON-111] Added "jackson-xc" jar to contains XML Compatibility
    extensions.

  New features:

  * [JACKSON-70] Add support for generating JSON Schema
  * [JACKSON-98] Allow serializing/deserializing field-accessible properties,
    in addition to method-accessible ones.
  * [JACKSON-105] Allow suppressing output of "default values"; which
    means value of a property when bean is constructed using the default
    no-arg constructor
   (requested by Christoph S)
  * [JACKSON-119] Add (optional) support for using JAXB annotations
    (by using JaxbAnnotationIntrospector)
   (requested by Ryan H)
  * [JACKSON-120] Add annotations @JsonSerialize, @JsonDeserialize,
    to streamline annotation by replacing host of existing annotations.
  * [JACKSON-123] Add "chaining" AnnotationIntrospector (implemented
    as inner class, AnnotationIntrospector.Pair) that allows combining
    functionality of 2 introspectors.

1.0.1 [04-Jun-2009]

  Fixes:

  * [JACKSON-104] Build fails on JDK 1.5, assorted other minor issues
   (reported by Oleksander A)
  * [JACKSON-121] Problems deserializing Date values of some ISO-8601
    variants (like one using 'Z' to indicate GMT timezone)

1.0.0 [09-May-2009]

  Fixes:

  * [JACKSON-103] Serializing Groovy objects; need to exclude getter method
    "getMetaClass" from serialization to prevent infinite recursion
   (reported by Ray T)

  Improvements:

  * Removed JAX-RS META-INF/services - based auto-registration for
    JAX-RS MessageBodyReader/MessageBodyWriter, because it could
    conflict with other application/json content handlers.

0.9.9-6 [27-Apr-2009]

  Improvements:

  * Improved jax-rs provider integration with jersey; now properly
    auto-registers as handler for json media type(s), and allows
    for defining custom ObjectMapper to be injected.

0.9.9-5 [20-Apr-2009]

  New features:

  * [JACKSON-88]: Support for "Setter-less" collection (and Map) types

  Improvements:

  * [JACKSON-100]: Allow specifying that BigInteger should be used instead
    of Integer or Long for "generic" integral numeric types (Object, Number)
    (DeserializationConfig.Feature.USE_BIG_INTEGER_FOR_INTS)
  * [JACKSON-101]: Allow disabling of access modifier overrides
    (SerializationgConfig.Feature.CAN_OVERRIDE_ACCESS_MODIFIERS)
    to support more security-constrainted running environments.

0.9.9-4 [14-Apr-2009]

  Fixes:

  * [JACKSON-94] Added missing "JsonParser.readValueAsTree()" method.
  * JacksonJsonProvider was using strict equality comparison against
    JSON type; instead needs to use "isCompatible". There were other
    similar problems
    (reported by Stephen D)
  * [JACKSON-97] Generic types (with bound wildcards) caused problems
    when Class introspector could not figure out that a concrete method
    was overriding/implementing generic method; as well as having
    problems with synthetic bridge methods.

  Improvements:

  * [JACKSON-95] Added support for deserializing simple exceptions
    (Throwable and its sub-classes): anything with a String constructor
    (assumed to take "message") should work to some degree.
  * [JACKSON-99] IOExceptions should not be wrapped during object
    mapping.
    (reported by Eldar A)

  New features:

  * [JACKSON-85]: Make Date deserialization (more) configurable (add
    DeserializationConfig.setDateFormat())
  * [JACKSON-93]: Allow overriding the default ClassIntrospector.
  * [JACKSON-96]: Allow enabling pretty-printing with data binding,
    through SerializationConfig object.

0.9.9-3 [03-Apr-2009]

  Fixes:

  * [JACKSON-79]: Primitive value deserialization fragile wrt nulls
  * [JACKSON-81]: Data binding code could lead to unnecessary blocking
    because it tried to advance parser (and stream) after binding
    (reported by Eldar A)

  New features:

  * [JACKSON-61]: Allow suppressing writing of bean properties with null values
   (requested by Justin F)
  * [JACKSON-63]: Create CustomDeserializerFactory to allow for adding
    custom deserializers for non-structured/generic types.
  * [JACKSON-75]: Add "any setter" method; ability to catch otherwise
    unknown (unmapped) properties and call a method with name+value.
  * [JACKSON-80]: Add @JsonValue annotation, to specify that a Bean value
    is to be serialized as value returned by annotated method: can for
    example annotate "toString()" method.
  * [JACKSON-84]: Added JsonGenerator.writeRawValue methods to augment
    existing JsonGenerator.writeRaw() method
    (requested by Scott A)
  * [JACKSON-86]: Added JsonParser.isClosed() and JsonGenerator.isClosed()
    methods.
  * [JACKSON-87]: Added ability to customized Date/Calendar serialization,
    both by toggling between timestamp (number) and textual (ISO-8601),
    and by specifying alternate DateFormat to use.

0.9.9-2 [19-Mar-2009]:

  Fixes:

  * [JACKSON-75]: Didn't have Deserializer for Number.class.

  Improvements:

  * [JACKSON-68]: Add DeserializationProblemListener, and
    DeserializationConfig.addHandler to add instances to ObjectMapper.
  * [JACKSON-71]: Add support ser/deser of Class.class.
  * [JACKSON-72]: Allow specifying that BigDecimal should be used instead
    of Double for "generic" numeric types (Object, Number)
    (DeserializationConfig.Feature.USE_BIG_DECIMAL_FOR_FLOATS)
  * [JACKSON-73]: Refactored ser/deser configuration settings into
    separate configuration classes.
  * [JACKSON-78]: Should be able to deserialize ints into Booleans (0 == false)

  New features:

  * [JACKSON-45]: Add convenience methods to help writing custom
    serializers
    (requested by Scott A)

0.9.9 [02-Mar-2009]:

  Fixes:

  * [JACKSON-59]: NPE with String[] serializer
    (reported by Kevin G)
  * [JACKSON-62]: NPE with JsonMappingException if source exception used
    null message.
    (reported by Justin F)
  * [JACKSON-64]: Handling of property name (with @JsonGetter, @JsonSetter)
    made bit more intuitive; uses bean naming convention if no explicit
    name given.

  Improvements:

  * [JACKSON-60]: Method annotations did not follow intuitive expectations
    of inheritability; now do.
  * [JACKSON-65]: Need to support typing using "java.lang.reflect.Type", to
    help integration with frameworks.
  * [JACKSON-66]: ObjectMapper now has "canSerialize" and "canDeserialize"
    methods to help frameworks figure out what is supported.

  New features:

  * [JACKSON-52]: Allow disabling name-based auto-detection of
    getter methods
    (requested by Justin F)
  * [JACKSON-58]: Allow defining custom global Enum serializer
    (to, for example, make Enums be serialized using Enum.toString(),
     or lower-case name or such)
  * [JACKSON-67]: Add JAX-RS provider based on Jackson that can handle
    JSON content type; initially as a separate jar.

  Other:

  * [JACKSON-22]: all contributors now have submitted contributor
    agreement, stored under 'DEV/agreements-received' in svn trunk.

0.9.8 [18-Feb-2009]:

  Fixes:

  * [JACKSON-49]: Incorrect bounds check for Float values resulted in
    exception when trying to serializer 0.0f.

  New features:

  * [JACKSON-32]: add annotations to configure serialization process
    (@JsonClass/@JsonContentClass/@JsonKeyClass; @JsonUseSerializer,
     @JsonUseDeserializer, @JsonIgnore)
  * [JACKSON-36]: add annotations to define property names that differ
    from bean naming convention (@JsonGetter/@JsonSetter)

  Improvements:

  * [JACKSON-47]: Change DeserializerProvider.findValueDeserializer to
    take "referrer" information. This is needed to be able to give
    contextual mappings where a given type may be deserialized differently
    (by different deserializer, and possibly to a different java class)
    depending on where the reference is from.
  * [JACKSON-48]: Integrate ObjectMapper with JsonGenerator, JsonParser;
    add MappingJsonFactory.
    (suggested by Scott A)
  * [JACKSON-50]: JsonNode.getElements() and .iterator() now work for
    ObjectNodes too, not just ArrayNodes. Also added convenience factory
    methods to allow constructing child nodes directly from container 
    nodes.
  * [JACKSON-53]: iBatis proxied value classes didn't work; fixed by
    prevent CGLib-generated "getCallbacks" from getting called.
    (reportd by Justin F)
  * [JACKSON-55]: Added support for reference-path-tracking in
    JsonMappingException, made serializers populate it: this to make
    it easier to trouble-shoot nested serialization problems
  * [JACKSON-56]: Added support for RFC-1123 date format, along with
    simpler "standard" format; and can add more as need be.

0.9.7 [04-Feb-2009]:

  Improvements:

  * [JACKSON-34]: Improved packaging by adding an intermediate directory
    in source tarball, to not mess up the current directory (and to indicate
    version number as well)
  * [JACKSON-37]: Make Jackson run on Android, by ensuring that there are
    no hard linkages to classes that Android SDK doesn't have (the only
    reference that was there, to XMLGregorianCalendar, was changed to
    soft linkage)
  * [JACKSON-42]: Add new JsonNode sub-class, BinaryNode, to represent
    base64 encoded binary content.

  New features:

  * [JACKSON-6]: Implement JsonParser.getBinaryValue() so that one can
    now also read Base64-encoded binary, not just write.
  * [JACKSON-40]: Add JsonParser.nextValue() for more convenient
    iteration.
  * [JACKSON-46]: Allow disabling quoting of field names by disabling
    feature 'JsonGenerator.feature.QUOTE_FIELD_NAMES'
   (requested by Scott Anderson)

0.9.6 [14-Jan-2009]:

  Bug fixes:

  * Serialization of some core types (boolean/java.lang.Boolean,
    long/java.lang.Long) was not working due to incorrectly mapped
    serializers.

  New features:

  * [JACKSON-31]: Complete rewrite of ObjectMapper's deserialization:
    now supports Beans, typed (generics-aware) Lists/Maps/arrays.

  Improvements:

  * [JACKSON-24]: Add efficient byte-array - based parser factory
    method to JsonFactory (has maybe 5% improvement over wrapping
    in ByteArrayInputStream).
  * [JACKSON-29]: Split classes in 2 jars: core that has parser and
    generator APIs and implementations; and mapper jar that has object
    and tree mapper code.
  * [JACKSON-30]: Renamed "JavaTypeMapper" as "ObjectMapper", and
    "JsonTypeMapper" as "TreeMapper"; new names should be more intuitive
    to indicate their purpose. Will leave simple implementations of
    old classes to allow for gradual migration of existing code.

0.9.5 [10-Dec-2008]:

  Bug fixes:

  * [JACKSON-25]: Problems with Maven pom for lgpl version
    (report by Ray R)
    note: backported to 0.9.4 Codehaus Maven repo

  Improvements:

  * [JACKSON-13]: JavaTypeMapper can now take JsonFactory argument, and
    thus is able to construct JsonParser/JsonGenerator instances as necessary
  * [JACKSON-17]: Handling of unknown types now configurable with
    JavaTypeMapper serialization (see JsonSerializerProvider for methods)
  * [JACKSON-20]: Handling of nulls (key, value) configurable with
    JavaTypeMapper serialization (see JsonSerializerProvider for methods)
  * [JACKSON-26]: Add convenience JsonGenerator.writeXxxField() methods
    to simplify json generation.

  New features:

  * [JACKSON-27]: Allow automatic closing of incomplete START_ARRAY and
    START_OBJECT events, when JsonGenerator.close() is called.

0.9.4 [26-Nov-2008]:

  Bug fixes:

  * [JACKSON-16]: JavaDocs regarding whether Jackson is to close underlying
    streams, readers and writers, were incorrect. Additionally added
    parser/generator features to allow specifying whether automatic closing
    is to be done by Jackson: feature is enabled by default, both for
    backwards compatibility, and because it seems like the right setting.
  * [JACKSON-18]: ArrayIndexOutOfBounds on IntNode, due to off-by-one
    problem with comparisons
   (reported by Michael D)
  * Fixed a problem with CR (\r) handling; was sometimes skipping
    characters (problematic if there's no indentation).
  * Multiple UTF-8 decoding fixes: was specifically not working for
    names.

  Improvements:

  * More complete JavaDoc comments for core public classes.
  * Internal cleanup of core parsing, to unify handling of Object and
    Array entries

0.8.0 - 0.9.3 [between 17-Oct-2007 and 05-Sep-2008]:

  Changes:

  * [JACKSON-5]: Symbol table construction was not thread-safe for
    utf-8 encoded content (new bug with 0.9.2, not present with earlier)
   (reported by Tudor B)
  * [JACKSON-8]: Serialization of BigDecimal broken with JavaTypeMapper
   (reported by Johannes L)
  * [JACKSON-9]: Add support for (non-standard) Json comments.
    (requested by Mike G)
  * [JACKSON-11]: Implement base64/binary methods for json generator.
  * [JACKSON-14]: Problems with generic collections, serializer
    method signatures (due to lack of covariance wrt collection types)
  * [JACKSON-15]: Add copy-through methods to JsonGenerator for
    pass-through copying of content (copyCurrentEvent, copyCurrentStructure)
  * [JACKSON-23]: Add OSGi manifest headers for jars (to run on OSGi container).
  * Added generic "feature" mechanism to parsers, writers; features are
    togglable (on/off) things with well-defined default values, implemented
    as Enums.

  * [JACKSON-1]: JsonNode now implements Iterable<JsonNode> so that
    it is possible use Java 5 foreach loop over array/object nodes.
   (suggested by Michael M)
  * [JACKSON-4] Added JsonParser.skipChildren() method.
  * UTF-16/32 handling was not completely correct, was erroneously
    skipping first 2/4 bytes in some cases (even when no BOM included).
    Also, related unit tests added/fixed.
  * JsonGenerator.useDefaultPrettyPrinter()/.setPrettyPrinter()
    allow for pretty printing (indentation).
   (thanks to Ziad M for suggestion, sample code)

  * Implicit conversions for numbers could sometimes lose accuracy,
    if floating-point number was first accessed as int/long, and then
    as a BigDecimal.
  * One Nasty NPE fixed from NameCanonicalizer (which was added in 0.9.2)

  * Java type mapper had a bug in Collection mapping (mismatched
    calls between writeStartArray and writeEndObject!)
   (reported by Mike E)
  * Java type mapper had a bug which prevented custom mappers (as
    well as slower interface-based introspection) from working.
   (reported by Mike E)
  * Numeric value parsing had some problems
  * JavaTypeMapper and JsonTypeMapper had a bug which resulted
    in NullPointerException when stream ends, instead of returning
    null to indicate it.
   (reported by Augusto C)
  * JavaTypeMapper did not implicitly flush generator after mapping
    objects: it should, and now will (note: JsonTypeMapper not directly
    affected, flushing still needed)
   (suggested by Maciej P)
