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)

------------------------------------------------------------------------
=== 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)
