深入学习Arduino_JSON库

忘记过去,超越自己

  • ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机菜鸟哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值