JSON数据格式及ArduinoJson | 您所在的位置:网站首页 › arduinojson › JSON数据格式及ArduinoJson |
文章目录
一、基本语法二、JSON对象三、JSON数组四、JSON.parse()
五、ArduinoJson 版本v5**JsonBuffer**:**JsonObject****JsonArray**
copyFrom —— 把c数组转成json数组copyTo —— 把json数组转成c数组createNestedArray —— 添加json数组(数组之中添加数组)createNestedObject —— 在数组中添加json对象get —— 获取具体index的值is —— 判断具体index的值是否为T类型measureLength —— 计算当前json数组通过printTo打印出来的长度measurePrettyLength —— 计算当前json数组通过prettyPrintTo打印出来的长度prettyPrintTo —— 格式化输出json数组字符串remove —— 移除某一个index位置的元素set —— 设置某一个index位置的值size —— 返回json数组元素的个数operator[] —— get/set 快捷快捷方式success —— 判断json数组是否成功分配内存或者解析
JSON学习
实例: { "site":[ {"name":"菜鸟教程","url":"www.runoob.com"}, {"name":"google","url":"www.google.com"}, {"name":"微博","url":"www.weibo.com"} ] }语法规则: 数据在名称/值对中数据由逗号隔开、大括号保存对象中括号保存数组由此可知实例中:"site"是包含三个对象的数组,中括号中的每个数据都是由大括号括起来的对象 一、基本语法名称/值对:“name” : “菜鸟教程”,此处的值可以为数字(整数或者小数)、字符串、逻辑值、数组、对象或者为null 对象:大括号{}包围的为对象,如{ “name”:“菜鸟教程” , “url”:“www.runoob.com” } 数组:中括号包围的为数组,如: { "sites": [ { "name":"菜鸟教程" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ] }数组中又可以包含对象作为成员 布尔值:true、false null:空 使用JavaScript语法: var sites = [ { "name":"runoob" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ];此处创建了一个数组,数组的内容是三个对象,如何访问数据呢 使用sites[0].name;会返回runoob,即访问第一个成员的name 对它赋值修改:sites[0].name=“菜鸟教程”; 二、JSON对象对象语法 实例:{ “name”:“runoob”, “alexa”:10000, “site”:null } JSON 对象使用在大括号({})中书写。对象可以包含多个 **key/value(键/值)**对,也可以叫属性和属性值吧。key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。key 和 value 中使用冒号(:)分割。每个 key/value 对使用逗号(,)分割。访问对象值:使用 .(点号)或中括号 [] 访问对象的值,类似C语言语法 实例: var myObj, x; myObj = { "name":"runoob", "alexa":10000, "site":null }; x = myObj.name;使用 myObj.name或者myObj[“name”]均可以访问name的值 循环对象:使用for-in循环对象的属性,类似python等语言的循环 var myObj = {"name":"runoob","alexa":10000,"site":null}; for (x in myObj){ document.getElementById("demo").innerHTML += x + ""; }在 for-in 循环对象的属性时,使用中括号([])来访问属性的值: var myObj = { "name":"runoob", "alexa":10000, "site":null }; for (x in myObj) { document.getElementById("demo").innerHTML += myObj[x] + ""; }嵌套json对象:即对象中包含对象 myObj = { "name":"runoob", "alexa":10000, "sites": { "site1":"www.runoob.com", "site2":"m.runoob.com", "site3":"c.runoob.com" } }仍然使用前面的方法点号或者中括号访问嵌套对象的值 x = myObj.sites.site1; // 或者 x = myObj.sites["site1"];修改对象值:访问后直接赋值即可 myObj.sites.site1 = "www.google.com"; //或者 myObj.sites["site1"] = "www.google.com";删除对象属性:访问后使用关键字delete delete myObj.sites.site1; //或者 delete myObj.sites["site1"] 三、JSON数组数组作为 JSON 对象:[ "Google", "Runoob", "Taobao" ] JSON 数组在中括号中书写JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)JavaScript 中,数组值可以是以上的 JSON 数据类型,也可以是 JavaScript 的表达式,包括函数,日期及undefined对象中的数组:属性的值可以是数组 { "name":"网站", "num":3, "sites":[ "Google", "Runoob", "Taobao" ] }使用索引值访问:x = myObj.sites[0];//访问sites属性的第一个值 循环数组:使用for-in访问或者for循环访问 for (i in myObj.sites) { x += myObj.sites[i] + ""; } for (i = 0; i "name":"网站", "num":3, "sites": [ { "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻译" ] }, { "name":"Runoob", "info":[ "菜鸟教程", "菜鸟工具", "菜鸟微信" ] }, { "name":"Taobao", "info":[ "淘宝", "网购" ] } ] }我们可以使用 for-in 来循环访问每个数组: for (i in myObj.sites) { x += "" + myObj.sites[i].name + ""; for (j in myObj.sites[i].info) { x += myObj.sites[i].info[j] + ""; } }数组值修改:直接访问赋值 myObj.sites[1] = "Github"; 删除数组元素(成员):delete关键字 delete myObj.site1[1] 四、JSON.parse()parse翻译过来是解析、分析,音译帕斯、怕死。。 使用它的用途: JSON 通常用于与服务端交换数据。 在接收服务器数据时一般是字符串。 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。 基本语法:JSON.parse(text[, reviver]) 参数: **text:**必需, 一个有效的 JSON 字符串。reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。解析实例: 接收的数据:{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" } 使用parse方法转换为JavaScript对象: var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }'); 五、ArduinoJson 版本v5包含三个方法:JsonBuffer、JsonObject、JsonArray JsonBuffer:ArduinoJson库的入口,负责处理整个json数据内存管理和解析等工作,包含两个类: DynamicJsonBuffer,内存分配在heap(堆)区,无固定大小,可以自动增长所需空间,方法调用完自动回收;StaticJsonBuffer,内存分配在stack(栈)区,有固定大小,大小值由开发者定义,方法调用完自动回收;常用方法: clear: 重置内存指针,复用内存空间,慎用。一旦你调用 JsonBuffer::clear(),所有之前分配的jsonobject或者jsonbuffer都会变成无效; createArray: 创建空的json数组并且分配空间 createObject : 创建空json对象,并为它分配内存空间 parse : 解析json(数组或者对象)字符串 parseArray: 解析json数组字符串 parseArray: 解析json数组字符串 parseObject: 解析json对象字符串 size: JsonBuffer当前已用大小 JsonObject在JsonBuffer构造出来的内存空间中,是Json对象的入口 常用方法: begin / end: 返回一个迭代器,可用于对象中的所有键值对 containsKey: 判断对象是否包含某一个key createNestedArray: 在当前对象中添加子key,子value为json数组 实例: StaticJsonBuffer 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" } }createNestedObject : 在当前对象中添加子key,子value为json对象 StaticJsonBuffer 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" } }get : 获取某一个key的值,T表示值类型 char json[] = "{\"pi\":3.14}"; StaticJsonBuffer jsonBuffer; JsonObject& object = jsonBuffer.parseObject(json); float pi = object.get("pi"); // template version of get() const char* value2 = object.get("toto"); // returns NULLis: 判断某一个key的值是否是T类型 char json[] = "{\"name\":\"toto\",\"pi\":3.14}"; StaticJsonBuffer jsonBuffer; JsonObject& obj = jsonBuffer.parseObject(json); bool nameIsString = obj.is("name"); // "hello":"world"}size —— 返回对象键值对的个数 JsonObject& object = jsonBuffer.createObject(); object["hello"] = "world"; Serial.println(object.size()); // 1operator[] —— get/set的快捷方式???即使用[]操作符 /**函数说明 * 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"];success —— 判断对象解析是否是有效 //Example 1: parsing success: StaticJsonBuffer jsonBuffer; JsonObject& object = jsonBuffer.parseObject("{\"hello\":\"world\"}"); Serial.println(object.success()); // true //Example 2: parsing failure: StaticJsonBuffer jsonBuffer; JsonObject& object = jsonBuffer.parseObject("[\"hello\",\"world\"]");//中括号为数组 Serial.println(object.success()); // false //Example 3: allocation success: StaticJsonBuffer jsonBuffer; JsonObject& object = jsonBuffer.createObject(); Serial.println(object.success()); // true //Example 4: allocation failure: StaticJsonBuffer jsonBuffer; JsonObject& object = jsonBuffer.createObject(); Serial.println(object.success()); // false JsonArrayJsonArray是Json数组的入口 常用方法: add —— 往数组中加入value /** * 往数组中加入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 jsonBuffer; JsonArray& array = jsonBuffer.createArray(); array.add("hello"); array.add(3.14156); array.printTo(Serial); //打印结果:["hello",3.14156] begin/end —— 返回一个迭代器,可用于数组中的所有对象 /** * 返回一个迭代器,可用于数组中的所有对象 * @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()); } // using C++98 syntax (for older compilers): for (JsonArray::iterator it=arr.begin(); it!=arr.end(); ++it) { Serial.println(it->as()); } //打印结果: one two three copyFrom —— 把c数组转成json数组 int values[] = {1, 2, 3}; StaticJsonBuffer jsonBuffer; JsonArray& array = jsonBuffer.createArray(); array.copyFrom(values); array.printTo(Serial); //打印结果 [1,2,3] copyTo —— 把json数组转成c数组 int values[3]; StaticJsonBuffer jsonBuffer; JsonArray& array = jsonBuffer.parseArray("[1,2,3]"); array.copyTo(values);//现在values变成1,2,3 createNestedArray —— 添加json数组(数组之中添加数组)nested为嵌套的意思 StaticJsonBuffer jsonBuffer; JsonArray& array = jsonBuffer.createArray(); array.add("hello"); JsonArray& nested = array.createNestedArray(); nested.add("world"); array.printTo(Serial); //打印结果:["hello",["world"]] createNestedObject —— 在数组中添加json对象 StaticJsonBuffer jsonBuffer; JsonArray& array = jsonBuffer.createArray(); JsonObject& nested = array.createNestedObject(); nested["hello"] = "world"; array.printTo(Serial); //打印结果:[{"hello":"world"}] get —— 获取具体index的值 integer默认值是0double默认值是0.0char* 默认是是NULL char json[] = "[1,3.14]"; StaticJsonBuffer jsonBuffer; JsonArray& array = jsonBuffer.parseArray(json); int value0 = array.get(0); // implicit cast of the JsonVariant float value1 = array.get(1); // template version of get() const char* value2 = array.get(2); // returns NULL is —— 判断具体index的值是否为T类型 char json[] = "[\"pi\",3.14]"; StaticJsonBuffer jsonBuffer; JsonArray& array = jsonBuffer.parseArray(json); bool firstIsString = array.is(0); // |
CopyRight 2018-2019 实验室设备网 版权所有 |