ArduinoJson v6.18.0 Release Notes

Release Date: 2021-05-05 // almost 3 years ago
    • โž• Added support for custom converters (issue #687)
    • โž• Added support for Printable (issue #1444)
    • โœ‚ Removed support for char values, see below (issue #1498)
    • ๐Ÿ‘ deserializeJson() leaves \uXXXX unchanged instead of returning NotSupported
    • ๐Ÿ‘ deserializeMsgPack() inserts null instead of returning NotSupported
    • โœ‚ Removed DeserializationError::NotSupported
    • โž• Added JsonVariant::is<JsonArrayConst/JsonObjectConst>() (issue #1412)
    • โž• Added JsonVariant::is<JsonVariant/JsonVariantConst>() (issue #1412)
    • ๐Ÿ”„ Changed JsonVariantConst::is<JsonArray/JsonObject>() to return false (issue #1412)
    • ๐Ÿ‘€ Simplified JsonVariant::as<T>() to always return T (see below)
    • โšก๏ธ Updated folders list in .mbedignore (PR #1515 by @AGlass0fMilk)
    • ๐Ÿ›  Fixed member-call-on-null-pointer in getMember() when array is empty
    • serializeMsgPack(doc, buffer, size) doesn't add null-terminator anymore (issue #1545)
    • serializeJson(doc, buffer, size) adds null-terminator only if there is enough room
    • ๐Ÿ— PlatformIO: set build.libArchive to false (PR #1550 by @askreet)

    BREAKING CHANGES

    ๐Ÿšš > #### Support for char removed

    We cannot cast a JsonVariant to a char anymore, so the following will break:

    char age = doc["age"];  //  error: no matching function for call to 'variantAs(VariantData*&)'
    

    Instead, you must use another integral type, such as int8_t:

    int8_t age = doc["age"];  // OK
    

    Similarly, we cannot assign from a char anymore, so the following will break:

    char age;
    doc["age"] = age;  // error: no matching function for call to 'VariantRef::set(const char&)'
    

    Instead, you must use another integral type, such as int8_t:

    int8_t age;
    doc["age"] = age;  // OK
    

    A deprecation warning with the message "Support for char is deprecated, use int8_t or uint8_t instead" was added to allow a smooth transition.

    as<T>() always returns T

    Previously, JsonVariant::as<T>() could return a type different from T. The most common example is as<char*>() that returned a const char*. While this feature simplified a few use cases, it was confusing and complicated the implementation of custom converters.

    Starting from this version, as<T> doesn't try to auto-correct the return type and always return T, which means that you cannot write this anymore:

    Serial.println(doc["sensor"].as<char*>());  // error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
    

    Instead, you must write:

    ๐Ÿ–จ > Serial.println(doc["sensor"].as<const char*>());  // OK
    

    A deprecation warning with the message "Replace as<char*>() with as<const char*>()" was added to allow a smooth transition.

    ๐Ÿšš > #### DeserializationError::NotSupported removed

    ๐Ÿšš > On a different topic, DeserializationError::NotSupported has been removed. Instead of returning this error:

    • deserializeJson() leaves \uXXXX unchanged (only when ARDUINOJSON_DECODE_UNICODE is 0) ๐Ÿ‘ > * deserializeMsgPack() replaces unsupported values with nulls

    Const-aware is<T>()

    Lastly, a very minor change concerns JsonVariantConst::is<T>(). It used to return true for JsonArray and JsonOject, but now it returns false. Instead, you must use JsonArrayConst and JsonObjectConst.