zoukankan      html  css  js  c++  java
  • ArduinoJson库 转载地址 https://blog.csdn.net/dpjcn1990/article/details/92831648

    1.前言
        前面,博主已经讲解了ArduinoJson库的V5版本。为了节省时间以及不讨论重复内容,博主建议读者先去阅读一下 玩转ArduinoJson库 V5版本 。重点了解几个东西:

    JSON协议
    JsonBuffer
    JsonObject
    JsonArray

        接下来,我们直接进入V6版本的学习,尽量和V5版本类比。
    2.ArduinoJson V6版本
        假设读者下载的V6版本的,那么可以参考 这里 的API说明。读者需要注意一下JsonDocument(可类比V5版本的JsonBuffer),因为V6版本的json操作都是在它上面。
        对于开发者来说,使用JSON无非就是编码或者解码,所以博主也会分出两种情况来讲解。
        首先我们来看看V6版本常用的百度脑图:

        可以看出,方法主要分为三大类:

    JsonDocument相关,这是整个json库的入口,它负责高效管理内存以及调用json解析器;
    JsonObject相关;
    JsonArray相关;
    解析、构造相关;

    2.0 解析、构造相关
    2.0.1 deserializeJson —— 解析json
    函数说明:
    详细可以参考 wiki
    /**
    * 解析json
    * @param doc jsondocument对象
    * @param input 输入内容
    * @return DeserializationError 解析结果
    */
    // writable input => zero-copy
    DeserializationError deserializeJson(JsonDocument& doc, char* input);
    DeserializationError deserializeJson(JsonDocument& doc, char* input, size_t inputSize);

    // read-only input => duplication
    DeserializationError deserializeJson(JsonDocument& doc, const char* input);
    DeserializationError deserializeJson(JsonDocument& doc, const char* input, size_t inputSize);
    DeserializationError deserializeJson(JsonDocument& doc, const __FlashStringHelper* input);
    DeserializationError deserializeJson(JsonDocument& doc, const __FlashStringHelper* input, size_t inputSize);
    DeserializationError deserializeJson(JsonDocument& doc, const String& input);
    DeserializationError deserializeJson(JsonDocument& doc, const std::string& input);
    DeserializationError deserializeJson(JsonDocument& doc, Stream& input);
    DeserializationError deserializeJson(JsonDocument& doc, std::istream& input);
    12345678910111213141516171819
    DeserializationError具体内容请参考 wiki
    例子说明:
    //Read-only input
    const char* json = "{"hello":"world"}";
    StaticJsonDocument<200> doc;
    deserializeJson(doc, json);
    const char* world = doc["hello"];

    //Zero-copy mode
    char json[] = "{"hello":"world"}";
    StaticJsonDocument<200> doc;
    deserializeJson(doc, json);
    const char* world = doc["hello"];

    //Raise the nesting limit
    char json[] = "[[[[[[[[[[[[[[[42]]]]]]]]]]]]]]]";
    StaticJsonDocument<200> doc;
    deserializeJson(doc, json, DeserializationOption::NestingLimit(15));;
    int answer = doc[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0];
    1234567891011121314151617
    2.0.2 serializeJson —— 构造序列化json
    函数说明:
    详细可以参考 wiki
    /**
    * 构造序列化json
    * @param doc jsondocument对象
    * @param output 输出内容
    */
    serializeJson(const JsonDocument& doc, char* output, size_t outputSize);
    serializeJson(const JsonDocument& doc, char output[size]);
    serializeJson(const JsonDocument& doc, Print& output);
    serializeJson(const JsonDocument& doc, String& output);
    serializeJson(const JsonDocument& doc, std::string& output);
    serializeJson(const JsonDocument& doc, std::ostream& output);
    1234567891011
    例子说明:
    StaticJsonDocument<200> doc;
    doc["hello"] = "world";
    serializeJson(doc, Serial);
    123
    打印结果:
    {"hello":"world"}
    1
    注意:

    此方法属于精简压缩化输出;

    2.0.3 serializeJsonPretty —— 构造序列化json,格式化输出
    函数说明:
    详细可以参考 wiki
    /**
    * 构造序列化json,格式化输出
    * @param doc jsondocument对象
    * @param output 输出内容
    */
    size_t serializeJsonPretty(const JsonDocument& doc, char* output, size_t outputSize);
    size_t serializeJsonPretty(const JsonDocument& doc, char output[size]);
    size_t serializeJsonPretty(const JsonDocument& doc, Print& output);
    size_t serializeJsonPretty(const JsonDocument& doc, String& output);
    size_t serializeJsonPretty(const JsonDocument& doc, std::string& output);
    12345678910
    例子说明:
    StaticJsonDocument<200> doc;
    doc["hello"] = "world";
    serializeJsonPretty(doc, Serial);
    123
    打印结果:
    {
    "hello": "world"
    }
    123
    注意:

    此方法属于格式化输出,需要考虑内存消耗;

    2.0.4 measureJson —— 计算构造序列化json的长度
    函数说明:
    详细可以参考 wiki
    /**
    * 计算构造序列化json的长度
    * @param doc jsondocument对象
    * @Note 关联方法 serializeJson
    */
    size_t measureJson(const JsonDocument& doc);
    123456
    例子说明:
    // Send headers
    client.println("Content-Type: application/json");
    client.print("Content-Length: ");
    client.println(measureJson(doc));

    // Terminate headers
    client.println();

    // Send body
    serializeJson(doc, client);
    12345678910
    2.0.5 measureJsonPretty —— 计算构造序列化格式化json的长度
    函数说明:
    详细可以参考 wiki
    /**
    * 计算构造序列化格式化json的长度
    * @param doc jsondocument对象
    * @Note 关联方法 serializeJsonPretty
    */
    size_t measureJsonPretty(const JsonDocument& doc);
    123456
    例子说明:
    // Send headers
    client.println("Content-Type: application/json");
    client.print("Content-Length: ");
    client.println(measureJsonPretty(doc));

    // Terminate headers
    client.println();

    // Send body
    serializeJsonPretty(doc, client);
    12345678910
    2.1 JsonDocument
        JsonDocument作为整个V6版本ArduinoJson库的内存入口,负责处理整个json数据的内存管理,这是我们需要首先重点关注的内容。
        它包括两个实现类:

    DynamicJsonDocument,内存分配在heap区,无固定大小,可以自动增长所需空间,方法调用完自动回收,建议内存大小大于1KB使用;

    StaticJsonDocument<256> doc;
    1

    StaticJsonDocument,内存分配在stack区,有固定大小,大小值由开发者定义,方法调用完自动回收,建议内存大小小于1KB使用;

    DynamicJsonDocument doc(2048);
    1
    使用JsonDocument
        当你创建一个JsonDocument之后,默认初始化为空,调用 JsonDocument::isNull()会返回true,这个时候既可以代表当做jsonObject,也可以当做jsonArray,这取决于你插入第一个value的类型。
        以下会作为JsonObject使用:
    DynamicJsonDocument doc(1024);
    doc["answer"] = 42;
    // the doc contains {"answer":42}
    123
        以下会作为JsonArray使用:
    DynamicJsonDocument doc(1024);
    doc.add(42);
    // the doc contains [42]
    123
        接下来,看看JsonDocument的一些常用方法:
    2.1.1 as —— 获取顶节点,并把它转成T类型
    函数说明:
    /**
    * 获取顶节点,并把它转成T类型
    * @return JsonArray/JsonObject/JsonVariant
    */
    JsonArray as<JsonArray>();
    JsonObject as<JsonObject>();
    JsonVariant as<JsonVariant>();
    1234567
    例子说明:
    DynamicJsonBuffer doc(1024);
    deserializeJson(doc, "{"key":"value")");

    // get the JsonObject in the JsonDocument
    JsonObject root = doc.as<JsonObject>();

    // get the value in the JsonObject
    const char* value = root["key"];
    12345678
    注意:

    此方法不会改变 JsonDocument的内容(JsonDocument::to()会改变)
    此方法只会返回JsonDocument顶节点的引用。如果顶节点的类型和强转的T类型不匹配,此方法将会返回空引用(比如,如果JsonDocument是一个jsonArray,当调用JsonDocument::as(),会返回空JsonObject)。

    2.1.2 add —— 往jsondocument添加元素
    函数说明:
    /**
    * 往jsondocument添加元素
    * @param value 元素
    */
    // add the specified value to the array
    bool add(bool value);

    bool add(float value);
    bool add(double value);

    bool add(signed char value);
    bool add(signed long value);
    bool add(signed int value);
    bool add(signed short value);
    bool add(unsigned char value);
    bool add(unsigned long value);
    bool add(unsigned int value);
    bool add(unsigned short value);

    bool add(char *value); // see Remarks
    bool add(const char *value);
    bool add(const __FlashStringHelper *value); // see Remarks

    bool add(const String &value); // see Remarks
    bool add(const std::string &value); // see Remarks

    bool add(JsonArray array);
    bool add(JsonObject object);
    bool add(JsonVariant variant);
    1234567891011121314151617181920212223242526272829
    例子说明:
    StaticJsonDocument<200> doc;
    array.add("hello"); // null -> ["hello"]
    array.add(3.14156); // ["hello"] -> ["hello",3.14156]
    serializeJson(doc, Serial);
    1234
    打印结果:
    ["hello",3.14156]
    1
    注意:

    如果JsonDocument顶节点是一个JsonArray,add方法会追加一个value到数组;
    如果JsonDocument顶节点是一个JsonObject,add无效;
    如果JsonDocument是一个空对象,add方法会把JsonDocument变成一个包含一个元素的数组,这是一个创建数组的方式;

    2.1.3 clear —— 清除JsonDocument并释放内存空间
    函数说明:
    /**
    * 清除JsonDocument并释放内存空间
    */
    void clear();
    1234
    注意:

    这个方法和JsonBuffer的clear方法不一样;

    2.1.4 createNestedArray —— 创建空json数组,并为它分配内存空间
    函数说明:
    /**
    * 创建空json数组,并为它分配内存空间
    * @param key key名称
    * @return JsonArray
    */
    // similar to JsonArray::createNestedArray()
    JsonArray createNestedArray();

    // similar to JsonObject::createNestedArray()
    JsonArray createNestedArray(char* key);
    JsonArray createNestedArray(const char* key);
    JsonArray createNestedArray(const __FlashStringHelper* key);
    JsonArray createNestedArray(const String& key);
    JsonArray createNestedArray(const std::string& key);
    1234567891011121314
    例子说明:
    DynamicJsonDocument doc(1024);
    JsonArray ports = doc.createNestedArray("ports");
    ports.add("80");
    ports.add("443");
    1234
    打印结果:
    {
    "ports": [
    80,
    443
    ]
    }
    123456
    注意:

    对于无参数的createNestedArray()方法,会创建一个Json数组并把它追加到顶节点的数组中。如果document的顶节点不是数组,这个方法无效;如果document是空的,这个方法会初始化一个数组顶节点,参考以下代码:

    StaticJsonDocument<200> doc;

    JsonArray arr = doc.createNestedArray();
    arr.add("hello world");

    serializeJson(doc, Serial);
    123456
    打印结果:
    [["hello world"]]
    1

    对于有参数的createNestedArray()方法,会创建一个json数组并把它指向这个特定的key。如果document的顶节点不是对象,这个方法无效;如果document是空的,这个方法会初始化一个对象顶节点,参考以下代码:

    StaticJsonDocument<200> doc;

    JsonArray array = doc.createNestedArray("hello");
    array.add("world");

    serializeJson(doc, Serial);
    123456
    打印结果:
    {"hello":["world"]}
    1
    2.1.5 createNestedObject —— 创建空json对象,并为它分配内存空间
    函数说明:
    /**
    * 创建空json对象,并为它分配内存空间
    * @param key key名称
    * @return JsonObject
    */
    // similar to JsonArray::createNestedArray()
    // similar to JsonArray::createNestedObject()
    JsonObject createNestedObject();

    // similar to JsonObject::createNestedObject()
    JsonObject createNestedObject(char* key);
    JsonObject createNestedObject(const char* key);
    JsonObject createNestedObject(const __FlashStringHelper* key);
    JsonObject createNestedObject(const String& key);
    JsonObject createNestedObject(const std::string& key);
    123456789101112131415
    例子说明:
    DynamicJsonDocument doc(1024);
    JsonArray wifi = doc.createNestedObject("wifi");
    wifi["SSID"] = "TheBatCave";
    123
    打印结果:
    {
    "wifi": {
    "SSID": "TheBatCave"
    }
    }
    12345
    注意:

    对于无参数的createNestedObject()方法,会创建一个Json对象并把它追加到顶节点的数组中。如果document的顶节点不是数组,这个方法无效;如果document是空的,这个方法会初始化一个数组顶节点,参考以下代码:

    StaticJsonDocument<200> doc;

    JsonObject obj = doc.createNestedObject();
    obj["hello"] = "world";

    serializeJson(doc, Serial);
    123456
    打印结果:
    [{"hello":"world"}]
    1

    对于有参数的createNestedObject()方法,会创建一个json数组并把它指向这个特定的key。如果document的顶节点不是对象,这个方法无效;如果document是空的,这个方法会初始化一个对象顶节点,参考以下代码:

    StaticJsonDocument<200> doc;

    JsonObject obj = doc.createNestedObject("nested");
    obj["hello"] = "world";

    serializeJson(doc, Serial);
    123456
    打印结果:
    {"nested":{"hello":"world"}}
    1
    2.1.6 getElement —— 获取index位置/key的元素
    函数说明:
    /**
    * 获取index位置/key的元素
    * @param index 索引位置
    * @return JsonVariant 如果找不到匹配的返回null
    */
    JsonVariant getElement(size_t index);
    123456
    2.1.7 getMember —— 获取key对应的value
    函数说明:
    /**
    * 获取key对应的value
    * @param key 对应的key
    * @param JsonVariant key对应的value,如果不匹配返回null
    */
    JsonVariant getMember(const char* key);
    JsonVariant getMember(String key);
    JsonVariant getMember(std::string key);
    JsonVariant getMember(const __FlashStringHelper* key);
    123456789
    2.1.8 getOrCreateMember —— 获取或者创建key对应的value
    函数说明:
    /**
    * 获取或者创建key对应的value
    * @param key 对应的key
    * @param JsonVariant key对应的value,如果不匹配返回null
    */
    JsonVariant getOrCreateMember(const char* key);
    JsonVariant getOrCreateMember(String key);
    JsonVariant getOrCreateMember(std::string key);
    JsonVariant getOrCreateMember(const __FlashStringHelper* key);
    123456789
    注意:

    如果JsonDocument包含一个对象,那么getOrCreateMember方法会获取指定key的值,如果对象不存在该key,这个方法会往对象添加一个新的key-value键值对;
    如果JsonDocument是空,那么getOrCreateMember方法将创建一个对象给到JsonDocument;
    如果属于以上两种情况之外的,此方法无效;

    2.1.9 operator[] —— 快捷操作符
    函数说明:
    /**
    * 快捷操作符
    * @param key 对象中对应的key
    * @param index 数组中对应的索引
    */
    // mimics a JsonArray
    ElementProxy operator[](size_t index);

    // mimics a JsonObject
    MemberProxy operator[](const char* key);
    MemberProxy operator[](char* key);
    MemberProxy operator[](const String& key);
    MemberProxy operator[](const std::string& key);
    MemberProxy operator[](const __FlashStringHelper* key);
    1234567891011121314
    例子说明:
    StaticJsonDocument<256> doc;
    doc["wifi"]["SSID"] = "TheBatCave";
    12
    打印内容:
    {
    "wifi": {
    "SSID": "TheBatCave"
    }
    }
    12345
    2.1.10 isNull —— 判断jsondocument是否为空
    函数说明:
    /**
    * 判断jsondocument是否为空
    */
    bool isNull() const;
    1234
    例子说明:
    //Result is true
    DynamicJsonDocument doc(1024);
    doc.isNull(); // true
    serializeJson(doc, Serial); // prints "null"

    //Result is false
    DynamicJsonDocument doc(1024);
    doc.to<JsonArray>();
    doc.isNull(); // false
    serializeJson(doc, Serial); // prints "[]"
    12345678910
    2.1.11 memoryUsage —— jsondocument已使用内存字节数
    函数说明:
    /**
    * jsondocument已使用内存字节数
    */
    size_t memoryUsage() const;
    1234
    例子说明:
    char json[] = "{"hello":"world"}";
    StaticJsonDocument<200> doc;
    deserializeJson(doc, json);

    Serial.println(doc.memoryUage());
    // prints 26 on AVR
    123456
    2.1.12 to —— jsondocument转成T类型
    函数说明:
    /**
    * jsondocument转成T类型,T为JsonArray、JsonObject、JsonVariant
    */
    JsonArray to<JsonArray>();
    JsonObject to<JsonObject>();
    JsonVariant to<JsonVariant>();
    123456
    例子说明:
    // allocate the JsonDocument
    StaticJsonDocument<200> doc;

    // convert it to a JsonObject
    JsonObject root = doc.to<JsonObject>();

    // set values
    root["hello"] = "world";
    12345678
    注意:

    此方法是释放jsondocument的内存空间,也就是说之前已经分配的引用无效,参考代码:

    DynamicJsonBuffer doc(1024);

    JsonObject root1 = doc.to<JsonObject>();

    JsonObject root2 = doc.to<JsonObject>();

    // Don't use root1 here, because it's dangling!
    1234567
    2.2 JsonObject
        在JsonDocument所构造出来的内存空间中,Json对象的入口就是JsonObject。
        让我们看看它的常用操作方法:
    2.2.1 begin/end —— 返回一个迭代器,可用于对象中的所有键值对
    函数说明:
    /**
    * 返回一个迭代器,可用于对象中的所有键值对
    */
    JsonObject::iterator begin() const;
    JsonObject::iterator end() const;
    12345
    例子说明:
    char json[] = "{"first":"hello","second":"world"}";
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, json);
    JsonObject root = doc.as<JsonObject>();

    // using C++11 syntax (preferred):
    for (JsonPair kv : root) {
    Serial.println(kv.key().c_str());
    Serial.println(kv.value().as<char*>());
    }

    // using C++98 syntax (for older compilers):
    for (JsonObject::iterator it=root.begin(); it!=root.end(); ++it) {
    Serial.println(it->key().c_str());
    Serial.println(it->value().as<char*>());
    }
    12345678910111213141516
    打印结果:
    first
    hello
    second
    world
    1234
    2.2.2 containsKey —— 判断对象是否包含某一个key
    函数说明:
    /**
    * 判断对象是否包含某一个key
    * @param key key名字
    * @return bool
    */
    bool containsKey(const char* key) const;
    bool containsKey(const String& key) const;
    bool containsKey(const std::string& key) const;
    bool containsKey(const __FlashStringHelper& key) const;
    123456789
    例子说明:
    StaticJsonDocument<256> doc;
    JsonObject root = doc.to<JsonObject>();
    root["city"] = "Paris";

    bool hasCity = root.containsKey("city"); // true
    bool hasCountry = root.containsKey("country"); // false
    }
    1234567
    注意:

    json库的开发者不建议使用该方法,因为就算没有值也会返回一个空值。库开发者给了例子建议:

    if (root.containsKey("error")) {
    const char* error = root["error"]
    Serial.println(error);
    return;
    }
    12345
    可以改成:
    JsonVariant error = root["error"];
    if (!error.isNull()) {
    Serial.println(error.as<char*>());
    return;
    }
    12345
    或者更加简单快速的方法:
    const char* error = root["error"];
    if (error) {
    Serial.println(error);
    return;
    }
    12345
    2.2.3 createNestedArray —— 在当前对象中添加子key,子value为json数组
    函数说明:
    /**
    * 在当前对象中添加子key,子value为json数组
    * @param key key名字
    * @return JsonArray
    */
    JsonArray createNestedArray(char* key) const;
    JsonArray createNestedArray(const char* key) const;
    JsonArray createNestedArray(const __FlashStringHelper* key) const;

    JsonArray createNestedArray(const String& key) const;
    JsonArray createNestedArray(const std::string& key) const;
    1234567891011
    例子说明:
    StaticJsonDocument<256> doc;
    JsonObject root = doc.to<JsonObject>();
    root["status"] = "on";
    JsonArray levels = root.createNestedArray("levels");
    levels.add(10);
    levels.add(30);
    serializeJsonPretty(root, Serial);
    1234567
    打印结果:
    {
    "status": "on",
    "levels": [
    10,
    20
    ]
    }
    1234567
    2.2.4 createNestedObject —— 在当前对象中添加子key,子value为json对象
    函数说明:
    /**
    * 在当前对象中添加子key,子value为json对象
    * @param key key名字
    * @return JsonObject对象
    */
    JsonObject createNestedObject(char* key) const;
    JsonObject createNestedObject(const char* key) const;
    JsonObject createNestedObject(const __FlashStringHelper* key) const;

    JsonObject createNestedObject(const String& key) const; // see Remarks
    JsonObject createNestedObject(const std::string& key) const; // see Remarks
    1234567891011
    例子说明:
    StaticJsonDocument<256> doc;
    JsonObject root = doc.to<JsonObject>();
    root["city"] = "Paris";
    JsonObject weather = root.createNestedObject("weather");
    weather["temp"] = 14.2;
    weather["cond"] = "cloudy";
    serializeJsonPretty(root, Serial);
    1234567
    打印结果:
    {
    "city": "Paris",
    "weather": {
    "temp": 14.20,
    "cond": "cloudy"
    }
    }
    1234567
    2.2.5 getMember —— 获取对象中给到key的value
    函数说明:
    /**
    * 获取对象中给到key的value
    * @param key key名字
    * @return JsonVariant对象
    */
    JsonVariant getMember(const char* key) const;
    JsonVariant getMember(const __FlashStringHelper* key) const;

    JsonVariant getMember(const String& key) const;
    JsonVariant getMember(const std::string& key) const;
    12345678910
    例子说明:
    例子1:
    //The key is not found
    char json[] = "{"username":"the_duke"}";

    StaticJsonDocument<256> doc;
    deserializeJson(doc, json);

    JsonObject object = doc.as<JsonObject>();

    JsonVariant password = object.getMember("password");
    if (password.isNull()) {
    Serial.println(F("Error: password is missing"));
    }
    123456789101112
    打印结果:
    Error: password is missing
    1
    例子2:
    //The key is found
    char json[] = "{"username":"the_duke"}";

    StaticJsonDocument<256> doc;
    deserializeJson(doc, json);

    JsonObject object = doc.as<JsonObject>();

    JsonVariant username = object.getMember("username");
    Serial.println(F("Your name is: "));
    Serial.println(username.as<const char*>());
    1234567891011
    打印结果:
    Your name is: the_duke
    1
    2.2.6 getOrCreateMember —— 获取对象中给到key的value,如果没有就创建
    函数说明:
    /**
    * 获取对象中给到key的value,如果没有就创建
    * @param key key名字
    * @return JsonVariant对象
    */
    JsonVariant getOrCreateMember(char* key) const;
    JsonVariant getOrCreateMember(const char* key) const;
    JsonVariant getOrCreateMember(const __FlashStringHelper* key) const;

    JsonVariant getOrCreateMember(const String& key) const;
    JsonVariant getOrCreateMember(const std::string& key) const;
    1234567891011
    2.2.7 isNull —— 判断对象是否为空
    函数说明:
    /**
    * 判断对象是否为空
    * @Note You can use this function to:
    * check if the object was successfully parsed, or
    * check if the object was successfully allocated.
    */
    bool isNull() const;
    1234567
    例子说明:
    //Example 1: parsing success:
    StaticJsonDocument<200> doc;
    deserializeJson(doc, "{"hello":"world"}");
    JsonObject object = doc.as<JsonObject>();
    Serial.println(object.isNull()); // false

    //Example 2: parsing failure:
    StaticJsonDocument<200> doc;
    deserializeJson(doc, "["hello","world"]");
    JsonObject object = doc.as<JsonObject>();
    Serial.println(object.isNull()); // true

    //Example 3: allocation success:
    StaticJsonDocument<200> doc;
    JsonObject object = doc.to<JsonObject>();
    Serial.println(object.isNull()); // false

    //Example 4: allocation failure:
    StaticJsonDocument<1> doc;
    JsonObject object = doc.to<JsonObject>();
    Serial.println(object.isNull()); // true
    123456789101112131415161718192021
    2.2.8 operator[] —— get/set快捷方式
    函数说明:
    /**
    * get/set快捷方式
    */
    MemberProxy operator[](char* key) const;
    MemberProxy operator[](const char* key) const;
    MemberProxy operator[](const __FlashStringHelper* key) const;

    MemberProxy operator[](const String& key) const;
    MemberProxy operator[](const std::string& key) const;
    123456789
    例子说明:
    //以下两行代码效果等同
    JsonVariant value = object["key"];
    JsonVariant value = object.getMember("key");

    //以下两行代码效果等同
    object["key"] = "value";
    object.getOrCreateMember("key").set("value");

    StaticJsonDocument<256> doc;
    JsonObject object = doc.to<JsonObject>();
    object["hello"] = "world";
    const char* world = object["hello"];
    123456789101112
    2.2.9 remove —— 移除特定key和value
    函数说明:
    /**
    * 移除特定key和value
    * @param key key名
    */
    void remove(const char* key) const;
    void remove(const __FlashStringHelper* key) const;

    void remove(const String& key) const;
    void remove(const std::string& key) const;
    123456789
    例子说明:
    JsonObject object = doc.to<JsonObject>();
    object["A"] = 1;
    object["B"] = 2;
    object["C"] = 3;
    object.remove("B");
    serializeJson(object, Serial);
    123456
    打印结果:
    {"A":1,"C":3}
    1
    注意:

    该方法只会移除key-value,但是并不会释放key-value对应的jsondocument空间,也不建议在循环中同时add和remove key-value;

    2.2.10 set —— 把一个json对象的内容设置给当前json对象
    函数说明:
    /**
    * 把一个json对象的内容设置给当前json对象
    */
    bool set(JsonObjectConst obj) const;
    1234
    2.2.11 size —— 返回对象键值对的个数
    函数说明:
    /**
    * 返回对象键值对的个数
    * @return size_t 个数
    */
    size_t size() const;
    12345
    例子说明:
    JsonObject object = doc.to<JsonObject>();
    object["hello"] = "world";
    Serial.println(object.size()); // 1
    123
    2.3 JsonArray
        在JsonDocument所构造出来的内存空间中,Json数组的入口就是JsonArray。
        让我们看看它的常用操作方法:
    2.3.1 add —— 往数组中加入value
    函数说明:
    /**
    * 往数组中加入value
    * @param value 值
    * @return bool 是否添加成功,如果返回false一般都是jsonbuffer没有足够的空间
    */
    bool add(bool value) const;

    bool add(float value) const;
    bool add(double value) const;

    bool add(signed char value) const;
    bool add(signed long value) const;
    bool add(signed int value) const;
    bool add(signed short value) const;
    bool add(unsigned char value) const;
    bool add(unsigned long value) const;
    bool add(unsigned int value) const;
    bool add(unsigned short value) const;

    bool add(const char *value) const;
    bool add(char *value) const;
    bool add(const __FlashStringHelper *value) const;

    bool add(const String &value) const;
    bool add(const std::string &value) const;

    bool add(JsonArray array) const;
    bool add(JsonObject object) const;
    bool add(JsonVariant variant) const;
    1234567891011121314151617181920212223242526272829
    例子说明:
    StaticJsonDocument<200> doc;
    JsonArray array = doc.to<JsonArray>();
    array.add("hello");
    array.add(3.14156);
    serializeJson(doc, Serial);
    12345
    打印结果:
    ["hello",3.14156]
    1
    2.3.2 begin/end —— 返回一个迭代器,可用于数组中的所有对象
    函数说明:
    /**
    * 返回一个迭代器,可用于数组中的所有对象
    * @return iterator
    */
    JsonArray::iterator begin() const;
    JsonArray::iterator end() const;
    123456
    例子说明:
    char json[] = "["one","two","three"]";
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, json);
    JsonArray arr = doc.as<JsonArray>();

    // using C++11 syntax (preferred):
    for (JsonVariant value : arr) {
    Serial.println(value.as<char*>());
    }

    // using C++98 syntax (for older compilers):
    for (JsonArray::iterator it=arr.begin(); it!=arr.end(); ++it) {
    Serial.println(it->as<char*>());
    }
    1234567891011121314
    打印结果:
    one
    two
    three
    123
    2.3.3 createNestedArray —— 添加json数组
    函数说明:
    /**
    * 添加json数组
    * @return JsonArray json数组
    */
    JsonArray createNestedArray() const;
    12345
    例子说明:
    StaticJsonDocument<200> doc;
    JsonArray array = doc.to<JsonArray>();
    array.add("hello");
    JsonArray nested = array.createNestedArray();
    nested.add("world");
    serializeJson(array, Serial);
    123456
    打印结果:
    ["hello",["world"]]
    1
    2.3.4 createNestedObject —— 添加json对象
    函数说明:
    /**
    * 添加json对象
    * @return JsonObject json对象
    */
    JsonObject createNestedObject() const;
    12345
    例子说明:
    StaticJsonDocument<200> doc;
    JsonArray array = doc.to<JsonArray>();
    JsonObject nested = array.createNestedObject();
    nested["hello"] = "world";
    serializeJson(array, Serial);
    12345
    打印结果:
    [{"hello":"world"}]
    1
    2.3.5 getElement —— 获取对应index的值
    函数说明:
    /**
    * 获取对应index的值
    */
    JsonVariant getElement(size_t index) const;;
    1234
    2.3.6 isNull —— 判断json数组是否为空
    函数说明:
    /**
    * 判断json数组是否为空
    * @Note You can use this function to:
    * check if the array was successfully parsed, or
    * check if the array was successfully allocated.
    */
    bool isNull() const;
    1234567
    例子说明:
    //Example 1: parsing success:
    StaticJsonDocument<200> doc;
    deserializeJson(doc, "[1,2]");
    JsonArray array = doc.as<JsonArray>();
    Serial.println(array.isNull()); // false

    //Example 2: parsing failure:
    StaticJsonDocument<200> doc;
    deserializeJson(doc, "{1,2}");
    JsonArray array = doc.as<JsonArray>();
    Serial.println(array.isNull()); // true

    //Example 3: allocation success:
    StaticJsonDocument<200> doc;
    JsonArray array = doc.to<JsonArray>();
    Serial.println(array.isNull()); // false

    //Example 4: allocation failure:
    StaticJsonDocument<1> doc;
    JsonArray array = doc.to<JsonArray>();
    Serial.println(array.isNull()); // true
    123456789101112131415161718192021
    2.3.7 operator[] —— set/get快捷方式
    函数说明:
    /**
    * set/get快捷方式
    */
    ElementProxy operator[](size_t index) const;
    1234
    例子说明:
    //以下两句代码含义一样
    JsonVariant value = array[0];
    JsonVariant value = array.getElement(0);

    //以下两句代码含义一样
    array[0] = "value";
    array.getElement(0).set("value");

    JsonArray array = doc.to<JsonArray>();
    array.add(42);
    int value = array[0];
    array[0] = 666;

    12345678910111213
    2.3.8 remove —— 移除某一个index位置的元素
    函数说明:
    /**
    * 移除某一个index位置的元素
    * @param index 索引
    */
    void remove(size_t index) const;
    12345
    例子说明:
    JsonArray array = doc.to<JsonArray>();
    array.add("A");
    array.add("B");
    array.add("C");
    array.remove(1);
    serializeJson(array, Serial);
    123456
    打印结果:
    ["A","C"]
    1
    注意:

    该方法只会移除索引对应的value,但是并不会释放对应的jsonDocument空间,也不建议在循环中同时add和remove;

    2.3.9 set —— 用另一个jsonArray代替当前jsonArray
    函数说明:
    /**
    *用另一个jsonArray代替当前jsonArray
    */
    bool set(JsonArrayConst src) const;
    1234
    2.3.10 size —— 返回json数组元素的个数
    函数说明:
    /**
    * 返回json数组元素的个数
    * @return size_t 个数
    */
    size_t size() const;
    12345
    例子说明:
    JsonArray array = doc.to<JsonArray>();
    array.add("hello");
    array.add("world");
    Serial.println(array.size()); // 2
    ————————————————
    版权声明:本文为CSDN博主「单片机菜鸟哥」的原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/dpjcn1990/article/details/92831648

  • 相关阅读:
    Leetcode 349. Intersection of Two Arrays
    hdu 1016 Prime Ring Problem
    map 树木品种
    油田合并
    函数学习
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 101. Symmetric Tree
    poj 2524 Ubiquitous Religions(宗教信仰)
    pat 1009. 说反话 (20)
  • 原文地址:https://www.cnblogs.com/Lonelychampion/p/12118445.html
Copyright © 2011-2022 走看看