忘记过去,超越自己
- ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
- ❤️ 本篇创建记录 2023-07-26 ❤️
- ❤️ 本篇更新记录 2023-07-26 ❤️
- 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝
- 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
- 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志 🔥零基础从入门到熟悉Arduino平台下开发ESP8266,同时会涉及网络编程知识。专栏文章累计超过60篇,分为基础篇、网络篇、应用篇、高级篇,涵盖ESP8266大部分开发技巧。
如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。
1.前言
一直以来,博主的事例代码中都一直使用到JSON数据格式。并且之前也讲解了
两篇内容来重点讲解讲解Arduino平台下的JSON库。
本篇主要是另外介绍一个虽然用得少但是一些经典案例会经常用的JSON库 —— Arduino_JSON库(名字看起来挺像的)。
2.JSON基础介绍
2.1 什么是Json?
- Json 指的是JavaScript对象表示法(JavaScript Object Notation)。
- Json 是轻量级的文本数据交换格式,类似于XML,比XML更小、更快,更容易解析。
- Json 独立于语言。
- Json 具有自我描述性,容易理解。
2.2 具体使用例子
2.2.1 JSON对象例子
JSON对象描述:
{
"motor": {
"left": 100,
"right": 20
},
"servo": {
"servo_1": 90
}
}
JSON对象语法说明:
- 这里分别有两个对象(对象是用{}区分),对象分别是motor、servo。
- 对于对象motor来说,有两个字段 left 和 right,它们的值类型是int型,值分别是100和20;
- 对于对象servo来说,有一个字段servo_1,它的值类型是int型,值是90。
2.2.2 JSON对象数组
JSON数组描述:
{
"employees": [
{
"firstName": "Bill",
"lastName": "Gates"
},
{
"firstName": "George",
"lastName": "Bush"
},
{
"firstName": "Thomas",
"lastName": "Carter"
}
]
}
JSON数组语法说明:
- 这里有一个对象数组(数组用[]区分)employees。
- 每个对象里面有两个字段firstName和lastName,它们的值类型都是String。
重点:
- 无论是JSON对象还是JSON数组,它们的核心都是键值对,也就是key-value形式。
3.Arduino_JSON库
- github地址
https://github.com/arduino-libraries/Arduino_JSON
说明文档也极其简介,就基于cJSON库。
- 安装
- 源码目录
对于开发者来说有三个概念是共通的:
- JsonObject —— json对象(存储key-value键值对的集合,每一个key是一个字符串,每一个value是一个JsonVariant)
- JsonArray —— json对象数组(存储一个JsonVariant的数组)
- JsonVariant —— json变体(存储可以放在json文件中的任意类型数据,包括int,float,数组,对象,开发者可以认为它是一个抽象的对象概念,底层内容,读者理解即可)
除了理解上面的三个概念,博主认为读者还必须注意以下两点:
- 构造json数据,一定是从最外层开始构造,从外到里一层层构造
- 解析json数据,虽然是交给Arduino_JSON库处理,但是我们获取数据也是从最外层开始获取,从外到里一层层获取
接下来,我们看看官方提供的几个案例。
3.1 JSONObject
/*
JSON Object
This sketch demonstrates how to use various features
of the Official Arduino_JSON library, in particular for JSON objects.
This example code is in the public domain.
*/
#include <Arduino_JSON.h>
#include <assert.h>
const char input[] = "{\"result\":true,\"count\":42,\"foo\":\"bar\"}";
void setup() {
Serial.begin(9600);
while (!Serial);
demoParse();
demoCreation();
}
void loop() {
}
// 演示如何解析json内容
void demoParse() {
Serial.println("parse");
Serial.println("=====");
// 解析成一个Json对象
JSONVar myObject = JSON.parse(input);
// JSON.typeof(jsonVar) can be used to get the type of the variable
// 如果发现Json Type是 undefined,说明是非JSON对象
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
Serial.print("JSON.typeof(myObject) = ");
// 打印对象类型
Serial.println(JSON.typeof(myObject)); // prints: object
// myObject.hasOwnProperty(key) checks if the object contains an entry for key
// 判断JSON对象是否存在某一个key
if (myObject.hasOwnProperty("result")) {
Serial.print("myObject[\"result\"] = ");
Serial.println((bool) myObject["result"]);
}
if (myObject.hasOwnProperty("count")) {
Serial.print("myObject[\"count\"] = ");
Serial.println((int) myObject["count"]);
}
if (myObject.hasOwnProperty("count")) {
Serial.print("myObject[\"count\"] = ");
Serial.println((double) myObject["count"]);
}
if (myObject.hasOwnProperty("foo")) {
Serial.print("myObject[\"foo\"] = ");
Serial.println((const char*) myObject["foo"]);
}
// JSONVars can be printed using print or println
Serial.print("myObject = ");
Serial.println(myObject);
Serial.println();
}
// 演示如何构建json对象
void demoCreation() {
Serial.println("creation");
Serial.println("========");
JSONVar myObject;
myObject["hello"] = "world";
myObject["true"] = true;
myObject["x1"] = (int) 42;
myObject["x2"] = (long) 42;
myObject["x3"] = (unsigned long) 42;
int x1 = myObject["x1"];
assert(x1 == 42);
long x2 = myObject["x2"];
assert(x2 == 42);
unsigned long x3 = myObject["x3"];
assert(x3 == 42);
Serial.print("myObject.keys() = ");
Serial.println(myObject.keys());
// JSON.stringify(myVar) can be used to convert the JSONVar to a String
// 把json对象转成字符串
String jsonString = JSON.stringify(myObject);
Serial.print("JSON.stringify(myObject) = ");
Serial.println(jsonString);
Serial.println();
// myObject.keys() can be used to get an array of all the keys in the object
// 获取json对象所有的key
JSONVar keys = myObject.keys();
// 遍历所有的key对应的value
for (int i = 0; i < keys.length(); i++) {
JSONVar value = myObject[keys[i]];
// 打印对应的类型和值
Serial.print("JSON.typeof(myObject[");
Serial.print(keys[i]);
Serial.print("]) = ");
Serial.println(JSON.typeof(value));
Serial.print("myObject[");
Serial.print(keys[i]);
Serial.print("] = ");
Serial.println(value);
Serial.println();
}
Serial.println();
// setting a value to undefined can remove it from the object
myObject["x"] = undefined;
// you can also change a value
myObject["hello"] = "there!";
Serial.print("myObject = ");
Serial.println(myObject);
}
关注几个api即可:
JSON.parse
JSON.typeof
hasOwnProperty
keys
JSON.stringify
3.2 JSONArray
/*
JSON Array
This sketch demonstrates how to use various features
of the Official Arduino_JSON library, in particular for JSON arrays.
This example code is in the public domain.
*/
#include <Arduino_JSON.h>
const char input[] = "[true, 42, \"apple\"]";
void setup() {
Serial.begin(9600);
while (!Serial);
demoParse();
demoCreation();
}
void loop() {
}
// 演示如何解析json数组
void demoParse() {
Serial.println("parse");
Serial.println("=====");
JSONVar myArray = JSON.parse(input);
// JSON.typeof(jsonVar) can be used to get the type of the variable
if (JSON.typeof(myArray) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
Serial.print("JSON.typeof(myArray) = ");
Serial.println(JSON.typeof(myArray)); // prints: array
// myArray.length() can be used to get the length of the array
Serial.print("myArray.length() = ");
Serial.println(myArray.length());
Serial.println();
Serial.print("JSON.typeof(myArray[0]) = ");
Serial.println(JSON.typeof(myArray[0]));
Serial.print("myArray[0] = ");
Serial.println(myArray[0]);
Serial.println();
Serial.print("myArray[1] = ");
Serial.println((int) myArray[1]);
Serial.println();
Serial.print("myArray[2] = ");
Serial.println((const char*) myArray[2]);
Serial.println();
Serial.println();
}
// 演示如何构建json数组
void demoCreation() {
Serial.println("creation");
Serial.println("========");
JSONVar myArray;
myArray[0] = false;
myArray[1] = 4242.5;
myArray[2] = "orange";
myArray[3] = "world";
myArray[4] = true;
myArray[5] = 42;
Serial.print("myArray.length() = ");
Serial.println(myArray.length());
// JSON.stringify(myVar) can be used to convert the JSONVar to a String
// 把json数组转成字符串
String jsonString = JSON.stringify(myArray);
Serial.print("JSON.stringify(myArray) = ");
Serial.println(jsonString);
Serial.println();
for (int i = 0; i < myArray.length(); i++) {
JSONVar value = myArray[i];
Serial.print("JSON.typeof(myArray[");
Serial.print(i);
Serial.print("]) = ");
Serial.println(JSON.typeof(value));
Serial.print("myArray[");
Serial.print(i);
Serial.print("] = ");
Serial.println(value);
Serial.println();
}
Serial.println();
}
关注几个api即可:
JSON.parse
JSON.typeof
length
JSON.stringify
3.3 JSONKitchenSink
/*
JSON Kitchen Sink
This sketch demonstrates how to use various features
of the Official Arduino_JSON library.
This example code is in the public domain.
*/
#include <Arduino_JSON.h>
void setup() {
Serial.begin(9600);
while (!Serial);
// 以下代码主要是针对不同类型进行构建测试
// 分别是: boolean int double string array object
booleanDemo();
intDemo();
doubleDemo();
stringDemo();
arrayDemo();
objectDemo();
}
void loop() {
}
void booleanDemo() {
Serial.println("boolean");
Serial.println("=======");
JSONVar myBoolean = true;
Serial.print("JSON.typeof(myBoolean) = ");
// 打印类型
Serial.println(JSON.typeof(myBoolean)); // prints: boolean
Serial.print("myBoolean = ");
Serial.println(myBoolean); // prints: true
myBoolean = false;
Serial.print("myBoolean = ");
Serial.println((boolean) myBoolean); // prints: 0
Serial.println();
}
void intDemo() {
Serial.println("int");
Serial.println("===");
JSONVar myInt = 42;
Serial.print("JSON.typeof(myInt) = ");
Serial.println(JSON.typeof(myInt)); // prints: number
Serial.print("myInt = ");
Serial.println(myInt); // prints: 42
myInt = 4242;
Serial.print("myInt = ");
Serial.println((int) myInt); // prints: 4242
Serial.println();
}
void doubleDemo() {
Serial.println("double");
Serial.println("======");
JSONVar myDouble = 42.5;
Serial.print("JSON.typeof(myDouble) = ");
Serial.println(JSON.typeof(myDouble)); // prints: number
Serial.print("myDouble = ");
Serial.println(myDouble); // prints: 42.5
myDouble = 4242.4242;
Serial.print("myDouble = ");
Serial.println((double) myDouble, 4); // prints: 4242.4242
Serial.println();
}
void stringDemo() {
Serial.println("string");
Serial.println("======");
JSONVar myString = "Hello World!";
Serial.print("JSON.typeof(myString) = ");
Serial.println(JSON.typeof(myString)); // prints: string
Serial.print("myString = ");
Serial.println(myString); // prints: Hello World!
myString = ":)";
Serial.print("myString = ");
Serial.println((const char*) myString); // prints: :)
Serial.println();
}
void arrayDemo() {
Serial.println("array");
Serial.println("=====");
JSONVar myArray;
myArray[0] = 42;
Serial.print("JSON.typeof(myArray) = ");
Serial.println(JSON.typeof(myArray)); // prints: array
Serial.print("myArray = ");
Serial.println(myArray); // prints: [42]
Serial.print("myArray[0] = ");
Serial.println((int)myArray[0]); // prints: 42
myArray[1] = 42.5;
Serial.print("myArray = ");
Serial.println(myArray); // prints: [42,42.5]
Serial.print("myArray[1] = ");
Serial.println((double)myArray[1]); // prints: 42.50
Serial.println();
}
void objectDemo() {
Serial.println("object");
Serial.println("======");
JSONVar myObject;
myObject["foo"] = "bar";
Serial.print("JSON.typeof(myObject) = ");
Serial.println(JSON.typeof(myObject)); // prints: object
Serial.print("myObject.keys() = ");
Serial.println(myObject.keys()); // prints: ["foo"]
Serial.print("myObject = ");
Serial.println(myObject); // prints: {"foo":"bar"}
myObject["blah"]["abc"] = 42;
Serial.print("myObject.keys() = ");
Serial.println(myObject.keys()); // prints: ["foo","blah"]
Serial.print("myObject = ");
Serial.println(myObject); // prints: {"foo":"bar","blah":{"abc":42}}
}
关注几个api即可:
JSON.typeof
keys
JSON.stringify
3.4 JSONValueExtractor
/*
JSON Value Extractor
This sketch demonstrates how to use some features
of the Official Arduino JSON library to traverse through all the
key value pair in the object and the nested objects.
Can be very helpful when searching for a specific data in a key
which is nested at multiple levels
The sketch actually use recursion to traverse all the keys in
a given JSON.
Example originally added on 24-03-2020
by Madhur Dixit https://github.com/Chester-King
This example code is in the public domain.
*/
#include <Arduino_JSON.h>
void setup() {
Serial.begin(9600);
while (!Serial);
valueExtractor();
}
void loop() {
}
void valueExtractor() {
Serial.println("object");
Serial.println("======");
JSONVar myObject;
// Making a JSON Object
myObject["foo"] = "bar";
myObject["blah"]["abc"] = 42;
myObject["blah"]["efg"] = "pod";
myObject["blah"]["cde"]["pan1"] = "King";
myObject["blah"]["cde"]["pan2"] = 3.14;
myObject["jok"]["hij"] = "bar";
Serial.println(myObject);
Serial.println();
Serial.println("Extracted Values");
Serial.println("======");
objRec(myObject);
}
// 对json对象解析递归展示value值,一般用来解析不知道结构的json对象
void objRec(JSONVar myObject) {
Serial.println("{");
for (int x = 0; x < myObject.keys().length(); x++) {
// 如果是对象就继续遍历
if ((JSON.typeof(myObject[myObject.keys()[x]])).equals("object")) {
Serial.print(myObject.keys()[x]);
Serial.println(" : ");
objRec(myObject[myObject.keys()[x]]);
}
else {
Serial.print(myObject.keys()[x]);
Serial.print(" : ");
Serial.println(myObject[myObject.keys()[x]]);
}
}
Serial.println("}");
}
这个场景主要是用来递归变量json对象属性值。
关注几个api即可:
JSON.typeof
keys
JSON.stringify
4. 核心API
通过上面的一些案例,我们可以得到几个最常见的核心api函数。
4.1 JSON.parse —— 解析字符串内容
static JSONVar parse(const char* s);
static JSONVar parse(const String& s);
这个方法主要是用来解析字符串内容。一般会结合 JSON.typeof 使用。
4.2 JSON.typeof —— 判断类型
String typeof(const JSONVar& value);
返回以下字符串:
- boolean
- int
- double
- string
- array
- object
- undefined - 表示非法对象
4.3 hasOwnProperty —— 是否存在某一个属性
bool hasOwnProperty(const char* key) const;
bool hasOwnProperty(const String& key) const;
额外,还可以判断是否等于某一个值
bool hasPropertyEqual(const char* key, const char* value) const;
bool hasPropertyEqual(const char* key, const JSONVar& value) const;
bool hasPropertyEqual(const String& key, const String& value) const;
bool hasPropertyEqual(const String& key, const JSONVar& value) const;
4.4 length —— 用于判断数组长度
int length() const;
4.5 keys —— 用于判断object的属性
JSONVar keys() const;
4.6 JSON.stringify —— 把json转成字符串
String stringify(const JSONVar& value);