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

  • 相关阅读:
    实验一
    requests/lxml的简单用例
    使用python的cookielib加载已保存的cookie维持登录状态
    计算机系统要素
    python实现部分实例
    ch2
    迷了迷了,外国人都看不懂的英语
    图形学名词解释
    ch17
    ServletConfig
  • 原文地址:https://www.cnblogs.com/Lonelychampion/p/12118445.html
Copyright © 2011-2022 走看看