mirror of
https://github.com/eledio-devices/thirdparty-ArduinoJson.git
synced 2025-11-02 16:14:19 +01:00
Added support for custom converters (closes #687)
This commit is contained in:
@@ -164,4 +164,42 @@ class ArrayRef : public ArrayRefBase<CollectionData>,
|
||||
private:
|
||||
MemoryPool* _pool;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Converter<ArrayConstRef> {
|
||||
static bool toJson(VariantRef variant, VariantConstRef value) {
|
||||
return variantCopyFrom(getData(variant), getData(value), getPool(variant));
|
||||
}
|
||||
|
||||
static ArrayConstRef fromJson(VariantConstRef variant) {
|
||||
return ArrayConstRef(variantAsArray(getData(variant)));
|
||||
}
|
||||
|
||||
static bool checkJson(VariantConstRef variant) {
|
||||
const VariantData* data = getData(variant);
|
||||
return data && data->isArray();
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Converter<ArrayRef> {
|
||||
static bool toJson(VariantRef variant, VariantConstRef value) {
|
||||
return variantCopyFrom(getData(variant), getData(value), getPool(variant));
|
||||
}
|
||||
|
||||
static ArrayRef fromJson(VariantRef variant) {
|
||||
VariantData* data = getData(variant);
|
||||
MemoryPool* pool = getPool(variant);
|
||||
return ArrayRef(pool, data != 0 ? data->asArray() : 0);
|
||||
}
|
||||
|
||||
static bool checkJson(VariantConstRef) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool checkJson(VariantRef variant) {
|
||||
VariantData* data = getData(variant);
|
||||
return data && data->isArray();
|
||||
}
|
||||
};
|
||||
} // namespace ARDUINOJSON_NAMESPACE
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
namespace ARDUINOJSON_NAMESPACE {
|
||||
// Forward declarations.
|
||||
class ArrayRef;
|
||||
class ObjectRef;
|
||||
template <typename>
|
||||
class ElementProxy;
|
||||
|
||||
|
||||
@@ -170,6 +170,10 @@ class ElementProxy : public VariantOperators<ElementProxy<TArray> >,
|
||||
return _array.getOrAddElement(_index);
|
||||
}
|
||||
|
||||
friend bool convertToJson(VariantRef variant, const this_type& value) {
|
||||
return variant.set(value.getUpstreamElement());
|
||||
}
|
||||
|
||||
TArray _array;
|
||||
const size_t _index;
|
||||
};
|
||||
|
||||
@@ -76,7 +76,8 @@ class ArrayCopier1D : public Visitor<size_t> {
|
||||
VariantSlot* slot = array.head();
|
||||
|
||||
while (slot != 0 && size < _capacity) {
|
||||
_destination[size++] = variantAs<T>(slot->data());
|
||||
_destination[size++] =
|
||||
Converter<T>::fromJson(VariantConstRef(slot->data()));
|
||||
slot = slot->next();
|
||||
}
|
||||
return size;
|
||||
|
||||
Reference in New Issue
Block a user