标签:and image 优化 signed 有一个 ons 方法 define type
????一直以来,博主的事例代码中都一直使用到JSON数据格式。而很多初学者一直对JSON格式有很大疑惑,所以博主特意分出一篇博文来重点讲解Arduino平台下的JSON库——ArduinoJSON。
????读者需要注意一下几点:
#include <ArduinoJson.h>
????废话少说,请读者认真以下干货内容。
JSON对象描述:
{
"motor": {
"left": 100,
"right": 20
},
"servo": {
"servo_1": 90
}
}
JSON对象语法说明:
JSON数组描述:
{
"employees": [
{
"firstName": "Bill",
"lastName": "Gates"
},
{
"firstName": "George",
"lastName": "Bush"
},
{
"firstName": "Thomas",
"lastName": "Carter"
}
]
}
JSON数组语法说明:
重点:
????上面说到,ArduinoJson库有两个大版本 —— V5 和 V6。
????不管是V5还是V6版本,在编码之前,请到Arduino IDE的管理库去下载:
????请读者按照自己的需求分别去下载不同版本(当然博主建议用新不用旧,毕竟一般新版本都是经过旧版本升级优化)。
????不管是V5 还是 V6版本,对于开发者来说有三个概念是共通的:
????除了理解上面的三个概念,博主认为读者还必须注意以下两点:
????记住上面的黑体内容,接下来,我们针对不同版本的ArduinoJson库来讲解使用以及注意事项。
????假设读者下载的V5版本的,那么可以参考 这里 的API说明。读者需要注意一下jsonBuffer,因为V5版本的json操作都是在它上面。
????对于开发者来说,使用JSON无非就是编码或者解码,所以博主也会分出两种情况来讲解。
????首先我们来看看V5版本常用的百度脑图:
????可以看出,方法主要分为三大类:
????JsonBuffer作为整个V5版本ArduinoJson库的入口,负责处理整个json数据的内存管理以及构造解析工作,这是我们需要首先重点关注的内容。
????它包括两个实现类:
????对于一些内存使用比较紧缺的机器,博主建议尽量用固定大小的StaticJsonBuffer(这个需要提前预知内容的大小,而这个内容大小可以通过计算得来,请点 wiki 参考)。
????那么,我们开发者可能会关心以下几个常见问题:
1. 问题1,如何去确定buffer的大小?
{"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
????那么通过JSON_OBJECT_SIZE(n)和JSON_ARRAY_SIZE(n)可以计算出内存大小:
const int BUFFER_SIZE = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2);
StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
????当然我们可以借助工具来帮我们计算内存大小,具体可以参考 ArduinoJson Assistant。
假设整个json数据结构是非固定的,开发者可以使用DynamicJsonBuffer,可以动态增长(动态增长就意味着可能会内存溢出,整个是需要开发者去考虑的),当然尽量给DynamicJsonBuffer一个足够大的初始值,可以减少调用malloc()方法去分配内存。
json解析器根据输入的内容会有不同的策略字符串。如果输入的内容是可写内容,比如 char* 或者 char[],解析器不会申请额外的内存空间,也就是“zero-copy”模式。如果输入的内容是自读内容,比如 const char* 或者 字符串 或者steam流,解析器会重新拷贝一份该字符串作为可写操作,这样就意味着JsonBuffer大小可能和我们预想的不一样。所以,博主建议开发者尽量是char* 或者 char[]。
2. StaticJsonBuffer 和 DynamicJsonBuffer的区别?
3. 如何去重用一个JsonBuffer?
// STEP1: parse input
StaticJsonBuffer<200> jsonBuffer;
JsonObject& inputObject = jsonBuffer.parseObject(inputJson);
...etc...
// STEP2: generate output
jsonBuffer.clear();
JsonObject& outputObject = jsonBuffer.createObject();
outputObject["hello"] = inputObject["world"];
????看起来没有什么问题,但实际上有访问错误,请看分析:
????那么要怎么解决这个问题呢?有两种解决方案:
// STEP1: parse input
StaticJsonBuffer<400> jsonBuffer;
JsonObject& inputObject = jsonBuffer.parseObject(inputJson);
...etc...
// STEP2: generate output
JsonObject& outputObject = jsonBuffer.createObject();
outputObject["hello"] = inputObject["world"];
// STEP1: parse input
StaticJsonBuffer<200> jsonBuffer1;
JsonObject& inputObject = jsonBuffer1.parseObject(inputJson);
...etc...
// STEP2: generate output
StaticJsonBuffer<200> jsonBuffer2;
JsonObject& outputObject = jsonBuffer2.createObject();
outputObject["hello"] = inputObject["world"];
4. 为什么不要去用一个全局的JsonBuffer?
????接下来,看看JsonBuffer的一些常用方法:
函数说明:
/**
* 重置内存指针,复用内存空间,慎用
*/
void clear();
例子说明:
StaticJsonBuffer<200> jb;
JsonObject& obj1 = jb.parseObject(json1);
// we can use obj1 here...
jb.clear();
// now obj1 is dangling!!!
// ...but we can reuse the JsonBuffer
JsonObject& obj2 = jb.parseObject(json2);
注意:
函数说明:
/**
* 创建空json数组,并为它分配内存空间
* @return json数组地址
* @Note 如果分配失败,会提示分配失败
*/
JsonArray& createArray();
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
array.add("hello");
array.add("world");
函数说明:
/**
* 创建空json对象,并为它分配内存空间
* @return json对象地址
* @Note 如果分配失败,会提示分配失败
*/
JsonObject createObject();
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.createObject();
object["hello"] = "world";
函数说明:
/**
* 解析json(数组或者对象)字符串
* @param json json字符串
* @param nestingLimit json深度限制
* @return jsonVariant对象
* @Note 此方法用于不可预知json格式的前提下使用的
*/
// The first overload, which accepts a modifiable array of chars, is the most efficient
// since it allows the zero-copy feature.
JsonVariant parse(char* json, uint8_t nestingLimit=10);
// The following overloads, which accept read-only strings, require a bigger JsonBuffer
// because parts of the JSON input has to be copied.
JsonVariant parse(const char* json, uint8_t nestingLimit=10);
JsonVariant parse(const String& json, uint8_t nestingLimit=10);
JsonVariant parse(const std::string& json, uint8_t nestingLimit=10);
JsonVariant parse(const __FlashStringHelper* json, uint8_t nestingLimit=10);
// The two last overloads, which accept input streams, make copy of the input too.
JsonVariant parse(Stream& json, uint8_t nestingLimit=10);
JsonVariant parse(std::istream& json, uint8_t nestingLimit=10);
例子说明:
char json[] = "[\"hello\",\"world\"]";
StaticJsonBuffer<200> jsonBuffer;
JsonVariant variant = jsonBuffer.parse(json);
if (variant.is<JsonArray>()) // true in this example
{
JsonArray& array = variant;
const char* hello = array[0];
const char* world = array[1];
}
函数说明:
/**
* 解析json数组字符串
* @param json json字符串
* @param nestingLimit json深度限制
* @return jsonArray对象
* @Note 此方法用于预知json格式是jsonArray的前提下使用的
*/
// The first overload, which accepts a modifiable array of chars, is the most efficient
// since it allows the zero-copy feature.
JsonArray& parseArray(char* json, uint8_t nestingLimit=10);
// The following overloads, which accept read-only strings, require a bigger JsonBuffer
// because parts of the JSON input has to be copied.
JsonArray& parseArray(const char* json, uint8_t nestingLimit=10);
JsonArray& parseArray(const String& json, uint8_t nestingLimit=10);
JsonArray& parseArray(const std::string& json, uint8_t nestingLimit=10);
JsonArray& parseArray(const __FlashStringHelper* json, uint8_t nestingLimit=10);
// The two last overloads, which accept input streams, make copy of the input too.
JsonArray& parseArray(Stream& json, uint8_t nestingLimit=10);
JsonArray& parseArray(std::istream& json, uint8_t nestingLimit=10);
例子说明:
char json[] = "[\"hello\",\"world\"]";
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.parseArray(json);
const char* hello = array[0];
const char* world = array[1];
函数说明:
/**
* 解析json对象字符串
* @param json json字符串
* @param nestingLimit json深度限制
* @return json对象
* @Note 此方法用于预知json格式是jsonObject的前提下使用的
*/
// The first overload, which accepts a modifiable array of chars, is the most efficient
// since it allows the zero-copy feature.
JsonObject& parseObject(char* json, uint8_t nestingLimit=10);
// The following overloads, which accept read-only strings, require a bigger JsonBuffer
// because parts of the JSON input has to be copied.
JsonObject& parseObject(const char* json, uint8_t nestingLimit=10);
JsonObject& parseObject(const String& json, uint8_t nestingLimit=10);
JsonObject& parseObject(const std::string& json, uint8_t nestingLimit=10);
JsonObject& parseObject(const __FlashStringHelper* json, uint8_t nestingLimit=10);
// The two last overloads, which accept input streams, make copy of the input too.
JsonObject& parseObject(Stream& json, uint8_t nestingLimit=10);
JsonObject& parseObject(std::istream& json, uint8_t nestingLimit=10);
例子说明:
char json[] = "{\"hello\":\"world\"}";
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.parseObject(json);
const char* world = object["hello"];
函数说明:
/**
* JsonBuffer当前已用大小
* @return 当前已用大小
*/
size_t size() const;
例子说明:
StaticJsonBuffer<200> jsonBuffer;
Serial.println(jsonBuffer.size());
jsonBuffer.createObject();
Serial.println(jsonBuffer.size());
jsonBuffer.createArray();
Serial.println(jsonBuffer.size());
在8位单片机中会打印:
0
4
8
????在JsonBuffer所构造出来的内存空间中,Json对象的入口就是JsonObject。
????让我们看看它的常用操作方法:
函数说明:
/**
* 返回一个迭代器,可用于对象中的所有键值对
* @return iterator iterator包括key和value
*/
JsonObject::iterator begin();
JsonObject::iterator end();
JsonObject::const_iterator begin() const;
JsonObject::const_iterator end() const;
例子说明:
char json[] = "{\"first\":\"hello\",\"second\":\"world\"}";
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
// using C++11 syntax (preferred):
for (auto kv : root) {
Serial.println(kv.key);
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);
Serial.println(it->value.as<char*>());
}
测试结果:
first
hello
second
world
函数说明:
/**
* 判断对象是否包含某一个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;
例子说明:
StaticJsonBuffer<256> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["city"] = "Paris";
bool hasCity = root.containsKey("city"); // true
bool hasCountry = root.containsKey("country"); // false
注意:
if (root.containsKey("error"))
{
const char* error = root["error"]
Serial.println(error);
return;
}
可以改成:
JsonVariant error = root["error"];
if (error.success())
{
Serial.println(error.as<char*>());
return;
}
或者更加简单快速的方法:
const char* error = root["error"];
if (error)
{
Serial.println(error);
return;
}
函数说明:
/**
* 在当前对象中添加子key,子value为json数组
* @param key key名字
* @return JsonArray
*/
JsonArray& createNestedArray(const char* key) const;
JsonArray& createNestedArray(char* key) const; // see Remarks
JsonArray& createNestedArray(const String& key) const; // see Remarks
JsonArray& createNestedArray(const std::string& key) const; // see Remarks
JsonArray& createNestedArray(const __FlashStringHelper* key) const; // see Remarks
例子说明:
StaticJsonBuffer<256> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["status"] = "on";
JsonArray& levels = root.createNestedArray("levels");
levels.add(10);
levels.add(30);
root.prettyPrintTo(Serial);
打印结果:
{
"status": "on",
"levels": [
10,
20
]
}
函数说明:
/**
* 在当前对象中添加子key,子value为json对象
* @param key key名字
* @return JsonObject对象
*/
JsonObject& createNestedObject(const char* key) const;
JsonObject& createNestedObject(char* key) const; // see Remarks
JsonObject& createNestedObject(const String& key) const; // see Remarks
JsonObject& createNestedObject(const std::string& key) const; // see Remarks
JsonObject& createNestedObject(const __FlashStringHelper* key) const; // see Remarks
例子说明:
StaticJsonBuffer<256> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["city"] = "Paris";
JsonObject& weather = root.createNestedObject("weather");
weather["temp"] = 14.2;
weather["cond"] = "cloudy";
root.prettyPrintTo(Serial);
打印结果:
{
"city": "Paris",
"weather": {
"temp": 14.20,
"cond": "cloudy"
}
}
函数说明:
/**
* 获取某一个key的值,T表示值类型
* @param key key名字
* @return 值
*/
bool get<bool> (TString key) const;
const char* get<const char*> (TString key) const;
double get<double> (TString key) const;
float get<float> (TString key) const;
JsonVariant get<JsonVariant> (TString key) const;
signed char get<signed char> (TString key) const;
signed int get<signed int> (TString key) const;
signed long get<signed long> (TString key) const;
signed short get<signed short> (TString key) const;
std::string get<std::string> (TString key) const;
String get<String> (TString key) const;
unsigned char get<unsigned char> (TString key) const;
unsigned int get<unsigned int> (TString key) const;
unsigned long get<unsigned long> (TString key) const;
unsigned short get<unsigned short> (TString key) const;
例子说明:
char json[] = "{\"pi\":3.14}";
StaticJsonBuffer<256> jsonBuffer;
JsonObject& object = jsonBuffer.parseObject(json);
float pi = object.get<float>("pi"); // template version of get()
const char* value2 = object.get<const char*>("toto"); // returns NULL
函数说明:
/**
* 判断某一个key的值是否是T类型
* @param key key名字
* @return bool
* true 为T类型
* false 不是T类型
*/
bool is<bool> (TString key) const;
bool is<const char*> (TString key) const;
bool is<char*> (TString key) const;
bool is<double> (TString key) const;
bool is<float> (TString key) const;
bool is<signed char> (TString key) const;
bool is<signed int> (TString key) const;
bool is<signed long> (TString key) const;
bool is<signed short> (TString key) const;
bool is<unsigned char> (TString key) const;
bool is<unsigned int> (TString key) const;
bool is<unsigned long> (TString key) const;
bool is<unsigned short> (TString key) const;
bool is<signed long long> (TString key) const; // <- may require ARDUINOJSON_USE_LONG_LONG
bool is<unsigned long long>(TString key) const; // <- may require ARDUINOJSON_USE_LONG_LONG
bool is<JsonArray> (TString key) const;
bool is<JsonObject> (TString key) const;
例子说明:
char json[] = "{\"name\":\"toto\",\"pi\":3.14}";
StaticJsonBuffer<256> jsonBuffer;
JsonObject& obj = jsonBuffer.parseObject(json);
bool nameIsString = obj.is<char*>("name"); // <- true
bool piIsFloat = obj.is<float>("pi"); // <- true
// but we could also use JsonVariant.is<T>(), like that:
nameIsString = obj["name"].is<char*>(); // <- true
piIsFloat = obj["pi"].is<float>(); // <- true
函数说明:
/**
* 计算当前对象通过printTo打印出来的长度
* @return size_t 长度值
* @Note 跟 JsonObject::printTo() 关联,此方法通常用于http协议中的 Content-Length头
*/
size_t measureLength() const
例子说明:
// Send headers
client.println("Content-Type: application/json");
client.print("Content-Length: ");
client.println(root.measureLength());
// Terminate headers
client.println();
// Send body
root.printTo(client);
函数说明:
/**
* 计算当前对象通过prettyPrintTo打印出来的长度
* @return size_t 长度值
* @Note 跟 JsonObject::prettyPrintTo() 关联,此方法通常用于http协议中的 Content-Length头
*/
size_t measurePrettyLength() const
例子说明:
// Send headers
client.println("Content-Type: application/json");
client.print("Content-Length: ");
client.println(root.measurePrettyLength());
// Terminate headers
client.println();
// Send body
root.prettyPrintTo(client);
函数说明:
/**
* 格式化输出json字符串
* @param buffer 内容输出到内存区
* @param size 内存区的大小
* @param Print 打印流 比如 Serial
* @param String 打印到字符串
* @return 返回已写大小
*/
size_t prettyPrintTo(char* buffer, size_t size) const;
size_t prettyPrintTo(char buffer[size]) const;
size_t prettyPrintTo(Print &) const;
size_t prettyPrintTo(String &) const;
size_t prettyPrintTo(std::string &) const;
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.createObject();
object["hello"] = "world";
object.prettyPrintTo(Serial);
打印结果:
{
"hello": "world"
}
函数说明:
/**
* 压缩式输出json字符串
* @param buffer 内容输出到内存区
* @param size 内存区的大小
* @param Print 打印流 比如 Serial
* @param String 打印到字符串
* @return 返回已写大小
*/
size_t printTo(char* buffer, size_t size) const;
size_t printTo(char buffer[size]) const;
size_t printTo(Print &) const;
size_t printTo(String &) const;
size_t printTo(std::string &) const;
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.createObject();
object["hello"] = "world";
object.printTo(Serial);
打印结果:
{"hello":"world"}
注意:
函数说明:
/**
* 移除特定key和value
* @param key key名
*/
void remove(const char* key);
void remove(const String& key);
void remove(const std::string& key);
void remove(const __FlashStringHelper* key);
例子说明:
JsonObject& object = jsonBuffer.createObject();
object["A"] = 1;
object["B"] = 2;
object["C"] = 3;
object.remove("B");
object.printTo(Serial);
打印结果:
{"A":1,"C":3}
注意:
函数说明:
/**
* 设置特定key的值
* @param key key名
* @param value 值
* @return bool 是否设置成功
*/
bool set(TString key, bool value);
bool set(TString key, float value);
bool set(TString key, double value);
bool set(TString key, signed char value);
bool set(TString key, signed long value);
bool set(TString key, signed int value);
bool set(TString key, signed short value);
bool set(TString key, unsigned char value);
bool set(TString key, unsigned long value);
bool set(TString key, unsigned int value);
bool set(TString key, unsigned short value);
bool set(TString key, const char *value);
bool set(TString key, char *value); // see Remarks
bool set(TString key, const String &value); // see Remarks
bool set(TString key, const std::string &value); // see Remarks
bool set(TString key, const __FlashStringHelper* value); // see Remarks
bool set(TString key, JsonArray &array);
bool set(TString key, JsonObject &object);
bool set(TString key, const JsonVariant &value);
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.createObject();
object.set("hello","world");
object.printTo(Serial);
打印结果:
{"hello":"world"}
函数说明:
/**
* 返回对象键值对的个数
* @return size_t 个数
*/
size_t size() const;
例子说明:
JsonObject& object = jsonBuffer.createObject();
object["hello"] = "world";
Serial.println(object.size()); // 1
函数说明:
/**
* get/set的快捷方式
*/
JsonVariant& operator[](const char* key);
JsonVariant& operator[](char* key); // see Remarks
JsonVariant& operator[](const String& key); // see Remarks
JsonVariant& operator[](const std::string& key); // see Remarks
JsonVariant& operator[](const __FlashStringHelper* key); // see Remarks
const JsonVariant& operator[](const char* key) const;
const JsonVariant& operator[](const String& key) const;
const JsonVariant& operator[](const std::string& key) const;
const JsonVariant& operator[](const __FlashStringHelper* key) const;
例子说明:
JsonObject& object = jsonBuffer.createObject();
object["hello"] = "world";
const char* world = object["hello"];
函数说明:
/**
* 判断对象是否是有效(解析或者分配内存)
* @return bool
*/
bool success() const;
例子说明:
//Example 1: parsing success:
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.parseObject("{\"hello\":\"world\"}");
Serial.println(object.success()); // true
//Example 2: parsing failure:
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.parseObject("[\"hello\",\"world\"]");
Serial.println(object.success()); // false
//Example 3: allocation success:
StaticJsonBuffer<200> jsonBuffer;
JsonObject& object = jsonBuffer.createObject();
Serial.println(object.success()); // true
//Example 4: allocation failure:
StaticJsonBuffer<1> jsonBuffer;
JsonObject& object = jsonBuffer.createObject();
Serial.println(object.success()); // false
????在JsonBuffer所构造出来的内存空间中,Json数组的入口就是JsonArray。
????让我们看看它的常用操作方法:
函数说明:
/**
* 往数组中加入value
* @param value 值
* @return bool 是否添加成功,如果返回false一般都是jsonbuffer没有足够的空间
*/
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(const char *value);
bool add(char *value); // see Remarks
bool add(const String &value); // see Remarks
bool add(const std::string &value); // see Remarks
bool add(const __FlashStringHelper *value); // see Remarks
bool add(JsonArray &array);
bool add(JsonObject &object);
bool add(const JsonVariant &variant);
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
array.add("hello");
array.add(3.14156);
array.printTo(Serial);
打印结果:
["hello",3.14156]
函数说明:
/**
* 返回一个迭代器,可用于数组中的所有对象
* @return iterator
*/
JsonObject::iterator begin();
JsonObject::iterator end();
JsonObject::const_iterator begin() const;
JsonObject::const_iterator end() const;
例子说明:
char json[] = "[\"one\",\"two\",\"three\"]";
DynamicJsonBuffer jsonBuffer;
JsonArray& arr = jsonBuffer.parseArray(json);
// using C++11 syntax (preferred):
for (auto 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*>());
}
打印结果:
one
two
three
函数说明:
/**
* 把c数组转成json数组
* @param array 数组
* @param len 数组大小
*/
// 1D arrays
JsonArray::copyFrom(T array[len]);
JsonArray::copyFrom(T* array, size_t len);
// 2D arrays
JsonArray::copyFrom(T array[][]);
例子说明:
int values[] = {1, 2, 3};
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
array.copyFrom(values);
array.printTo(Serial);
打印结果:
[1,2,3]
函数说明:
/**
* 把json数组转成c数组
* @param array 数组
*/
JsonArray::copyTo(int array[]);
JsonArray::copyTo(double array[]);
JsonArray::copyTo(const char* array[]);
例子说明:
int values[3];
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.parseArray("[1,2,3]");
array.copyTo(values);//现在values变成1,2,3
函数说明:
/**
* 添加json数组
* @return JsonArray json数组
*/
JsonArray& createNestedArray();
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
array.add("hello");
JsonArray& nested = array.createNestedArray();
nested.add("world");
array.printTo(Serial);
打印结果:
["hello",["world"]]
函数说明:
/**
* 添加json对象
* @return JsonObject json对象
*/
JsonObject& createNestedObject();
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
JsonObject& nested = array.createNestedObject();
nested["hello"] = "world";
array.printTo(Serial);
打印结果:
[{"hello":"world"}]
函数说明:
/**
* 获取具体index的值
* @param index 索引
* @return T 返回索引对应的值
*/
bool get<bool> (size_t index) const;
const char* get<const char*> (size_t index) const;
const char* get<char*> (size_t index) const;
double get<double> (size_t index) const;
float get<float> (size_t index) const;
signed char get<signed char> (size_t index) const;
signed int get<signed int> (size_t index) const;
signed long get<signed long> (size_t index) const;
signed short get<signed short> (size_t index) const;
unsigned char get<unsigned char> (size_t index) const;
unsigned int get<unsigned int> (size_t index) const;
unsigned long get<unsigned long> (size_t index) const;
unsigned short get<unsigned short> (size_t index) const;
JsonVariant get<JsonVariant> (size_t index) const;
std::string get<std::string> (size_t index) const;
String get<String> (size_t index) const;
例子说明:
char json[] = "[1,3.14]";
StaticJsonBuffer<256> jsonBuffer;
JsonArray& array = jsonBuffer.parseArray(json);
int value0 = array.get(0); // implicit cast of the JsonVariant
float value1 = array.get<float>(1); // template version of get()
const char* value2 = array.get(2); // returns NULL
注意:
函数说明:
/**
* 判断具体index的值是否为T类型
* @return bool 是否是目标类型
*/
bool is<bool> (size_t index) const;
bool is<const char*> (size_t index) const;
bool is<char*> (size_t index) const;
bool is<double> (size_t index) const;
bool is<float> (size_t index) const;
bool is<signed char> (size_t index) const;
bool is<signed int> (size_t index) const;
bool is<signed long> (size_t index) const;
bool is<signed short> (size_t index) const;
bool is<unsigned char> (size_t index) const;
bool is<unsigned int> (size_t index) const;
bool is<unsigned long> (size_t index) const;
bool is<unsigned short> (size_t index) const;
bool is<signed long long> (size_t index) const; // <- may require ARDUINOJSON_USE_LONG_LONG
bool is<unsigned long long>(size_t index) const; // <- may require ARDUINOJSON_USE_LONG_LONG
bool is<JsonArray> (size_t index) const;
bool is<JsonObject> (size_t index) const;
例子说明:
char json[] = "[\"pi\",3.14]";
StaticJsonBuffer<256> jsonBuffer;
JsonArray& array = jsonBuffer.parseArray(json);
bool firstIsString = array.is<char*>(0); // <- true
bool secondIsFloat = array.is<float>(1); // <- true
// but we could also use JsonVariant.is<T>(), like that:
firstIsString = array[0].is<char*>(); // <- true
secondIsFloat = array[1].is<float>(); // <- true
函数说明:
/**
* 计算当前json数组通过printTo打印出来的长度
* @return size_t 长度值
* @Note 跟 JsonArray::printTo() 关联,此方法通常用于http协议中的 Content-Length头
*/
size_t measureLength() const
例子说明:
// Send headers
client.println("Content-Type: application/json");
client.print("Content-Length: ");
client.println(root.measureLength());
// Terminate headers
client.println();
// Send body
root.printTo(client);
函数说明:
/**
* 计算当前json数组通过prettyPrintTo打印出来的长度
* @return size_t 长度值
* @Note 跟 JsonArray::prettyPrintTo() 关联,此方法通常用于http协议中的 Content-Length头
*/
size_t measurePrettyLength() const
例子说明:
// Send headers
client.println("Content-Type: application/json");
client.print("Content-Length: ");
client.println(root.measurePrettyLength());
// Terminate headers
client.println();
// Send body
root.prettyPrintTo(client);
函数说明:
/**
* 格式化输出json数组字符串
* @param buffer 内容输出到内存区
* @param size 内存区的大小
* @param Print 打印流 比如 Serial
* @param String 打印到字符串
* @return 返回已写大小
*/
size_t prettyPrintTo(char* buffer, size_t size) const;
size_t prettyPrintTo(char buffer[size]) const;
size_t prettyPrintTo(Print &) const;
size_t prettyPrintTo(String &) const;
size_t prettyPrintTo(std::string &) const;
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
array.add("hello");
array.add("world");
array.prettyPrintTo(Serial);
打印结果:
[
"hello",
"world"
]
函数说明:
/**
* 压缩式输出json数组字符串
* @param buffer 内容输出到内存区
* @param size 内存区的大小
* @param Print 打印流 比如 Serial
* @param String 打印到字符串
* @return 返回已写大小
*/
size_t printTo(char* buffer, size_t size) const;
size_t printTo(char buffer[size]) const;
size_t printTo(Print &) const;
size_t printTo(String &) const;
size_t printTo(std::string &) const;
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
array.add("hello");
array.add("world");
array.printTo(Serial);
打印结果:
["hello","world"]
注意:
函数说明:
/**
* 移除某一个index位置的元素
* @param index 索引
*/
void remove(size_t index);
例子说明:
JsonArray& array = jsonBuffer.createArray();
array.add("A");
array.add("B");
array.add("C");
array.remove(1);
array.printTo(Serial);
打印结果:
["A","C"]
注意:
函数说明:
/**
* 设置某一个index位置的值
* @param index 索引位置
* @param value 值
* @return bool 是否设置成功
*/
bool set(size_t index, bool value);
bool set(size_t index, double value);
bool set(size_t index, float value);
bool set(size_t index, signed char value);
bool set(size_t index, signed int value);
bool set(size_t index, signed long value);
bool set(size_t index, signed short value);
bool set(size_t index, unsigned char value);
bool set(size_t index, unsigned int value);
bool set(size_t index, unsigned long value);
bool set(size_t index, unsigned short value);
bool set(size_t index, const char *value);
bool set(size_t index, char *value); // see Remarks
bool set(size_t index, const std::string &value); // see Remarks
bool set(size_t index, const String &value); // see Remarks
bool set(size_t index, const __FlashStringHelper *value); // see Remarks
bool set(size_t index, JsonArray &array);
bool set(size_t index, JsonObject &object);
bool set(size_t index, const JsonVariant &value);
例子说明:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
// increase the size of the array
array.add(666);
array.add(666);
// replace the values
array.set(0, "hello");
array.add(1, 3.14156);
// serialize
array.printTo(Serial);
打印结果:
["hello",3.14156]
函数说明:
/**
* 返回json数组元素的个数
* @return size_t 个数
*/
size_t size() const;
例子说明:
JsonArray& array = jsonBuffer.createArray();
array.add("hello");
array.add("world");
Serial.println(array.size()); // 2
函数说明:
/**
* get/set的快捷方式
*/
JsonVariant& operator[](size_t index);
const JsonVariant& operator[](size_t index) const;
例子说明:
JsonArray& array = jsonBuffer.createArray();
array.add(42);
int value = array[0];
array[0] = 666;
函数说明:
/**
* 判断json数组是否成功分配内存或者解析
* @return bool
*/
bool success() const;
例子说明:
//Example 1: parsing success:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.parseArray("[1,2]");
Serial.println(array.success()); // true
//Example 2: parsing failure:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.parseArray("{1,2}");
Serial.println(array.success()); // false
//Example 3: allocation success:
StaticJsonBuffer<200> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
Serial.println(array.success()); // true
//Example 4: allocation failure:
StaticJsonBuffer<1> jsonBuffer;
JsonArray& array = jsonBuffer.createArray();
Serial.println(array.success()); // false
????讲完理论知识,我们开始用具体例子来验证。
实验材料:
例子代码:
/**
* 构造json例子
* @author 单片机菜鸟
* @date 2019/06/01
*/
#include <ArduinoJson.h>
void setup() {
Serial.begin(115200);
while (!Serial) continue;
// Json对象对象树的内存工具 静态buffer
// 200 是大小 如果这个Json对象更加复杂,那么就需要根据需要去增加这个值.
StaticJsonBuffer<200> jsonBuffer;
// StaticJsonBuffer 在栈区分配内存 它也可以被 DynamicJsonBuffer(内存在堆区分配) 代替
// DynamicJsonBuffer jsonBuffer;
//创建最外层的json对象 —— root对象,顶节点
JsonObject& root = jsonBuffer.createObject();
//给最外层json对象添加属性
root["sensor"] = "gps";
root["time"] = 1351824120;
//在root对象中加入data数组
JsonArray& data = root.createNestedArray("data");
data.add(48.756080);
data.add(2.302038);
//在串口中打印,printTo方法不会格式化json
root.printTo(Serial);
// This prints:
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
Serial.println();
//在串口中打印,prettyPrintTo方法会格式化json
root.prettyPrintTo(Serial);
// This prints:
// {
// "sensor": "gps",
// "time": 1351824120,
// "data": [
// 48.756080,
// 2.302038
// ]
// }
}
void loop() {
// not used in this example
}
运行结果:
实验材料:
例子代码:
/**
* 解码Json字符串
* @author 单片机菜鸟
* @date 2019/06/02
*/
#include <ArduinoJson.h>
void setup() {
Serial.begin(115200);
while (!Serial) continue;
// Json对象对象树的内存工具 静态buffer
// 200 是大小 如果这个Json对象更加复杂,那么就需要根据需要去增加这个值.
StaticJsonBuffer<200> jsonBuffer;
// StaticJsonBuffer 在栈区分配内存 它也可以被 DynamicJsonBuffer(内存在堆区分配) 代替
// DynamicJsonBuffer jsonBuffer;
char json[] =
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
JsonObject& root = jsonBuffer.parseObject(json);
// Test if parsing succeeds.
if (!root.success()) {
Serial.println("parseObject() failed");
return;
}
// Fetch values.
//
// Most of the time, you can rely on the implicit casts.
// In other case, you can do root["time"].as<long>();
const char* sensor = root["sensor"];
long time = root["time"];
double latitude = root["data"][0];
double longitude = root["data"][1];
// Print values.
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);
Serial.println(longitude, 6);
}
void loop() {
// not used in this example
}
注意:
比如,如果开发者当前版本为 5.13.2,那么就会有:
#define ARDUINOJSON_VERSION "5.13.2" //完整版本号
#define ARDUINOJSON_VERSION_MAJOR 5 //大版本
#define ARDUINOJSON_VERSION_MINOR 13 //小版本
#define ARDUINOJSON_VERSION_REVISION 2 //小小版本
我们可以通过Serial打印版本号:
Serial.print("Using ArduinoJson version ");
Serial.println(ARDUINOJSON_VERSION);
通过它,我们可以做一些事情,比如:
#ifndef ARDUINOJSON_VERSION
#error ArduinoJson not found, please include ArduinoJson.h in your .ino file
#endif
#if ARDUINOJSON_VERSION_MAJOR!=5 || ARDUINOJSON_VERSION_MINOR<13
#error ArduinoJson 5.13+ is required
#endif
????总体上,Json属于一种数据交换格式,不会说太难。本篇属于简单介绍了ArduinoJson V5库的使用,更加复杂的使用请直接去到ArduinoJson的主页去查阅。
标签:and image 优化 signed 有一个 ons 方法 define type
原文地址:https://www.cnblogs.com/danpianjicainiao/p/11048675.html