JSON(数据格式)

# 简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格局。它基于ECMAScript的一个子集。 JSON选用完全独立于言语的文本格局,但是也使用了类似于C言语宗族的习气(包含C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使json调试成为抱负的数据交换言语。 易于人阅览和编写,同时也易于机器解析和生成(一般用于提高网络传输速率)。 # API说明 > 详细的API介绍见[JSON API章节](https://doc.openluat.com/wiki/21?wiki_page_id=2261) # 实现流程 ## 1.了解JSON 先简单讲解一下JSON的一些简单基础知识,让大家认识JSON。 在学习JavaScript的过程中,我们接触了一种新的数据格式——JSON数据格式。JSON的全称是”JavaScript Object Notation”,意思是javascript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。  1.JSON的格式  JSON 数据的书写格式是键(名称)/值对。  JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对包括字段名称(在双引号中),后面写一个冒号,然后是值。  JSON 值可以是:字符串(在双引号中)、数组(在中括号中)、数字(整数或浮点数)、逻辑值(true 或 false)、对象(在大括号中)、 null。  2.JSON结构  JSON结构有两种结构,就是对象和数组。通过这两种结构可以表示各种复杂的结构。  {"province": "Shanxi"} 可以理解为是一个包含province为Shanxi的对象,  ["Shanxi","Shandong"]这是一个包含两个元素的数组  而 [{"province": "Shanxi"},{"province": "Shandong"}] 就表示包含两个对象的数组。  当然了,你也可以使用 {"province":["Shanxi","Shandong"]} 来简化上面的JSON,这是一个拥有一个name数组的对象。   下面是一小段JSON代码:  {“skillz”: {“web”:[ {“name”: “html”, “years”: “5” }, {“name”: “css”, “years”: “3” }],”database”:[ {“name”: “sql”, “years”: “7” }]}}  花括弧,方括弧,冒号和逗号 :花括弧表示一个“容器” ,方括号装载数组 ,名称和值用冒号隔开 ,数组元素通过逗号隔开 。 ## 2.JSON编译和解析 这篇文章介绍JSON的两种用法:编译,解析 1.编译 * JSON有自己规定的格式,上面我们也简单介绍了,一点的格式错误都无法JSON解析出有效数据。这里我们提供了JSON编译函数,你只需要把有效数据放入table类型的变量中,然后传入JSON编译函数json.encode(table类型变量),他就会返回JSON有效字符串。 2.解析 * JSON解析也很简单,有解析函数json.decode(origin),origin是待解析的JSON字符串。他会返回三个值(解析的内容,解析结果,错误信息)当JSON有效字符串被解析后,有效的数据就会被放在table的变量里,你需要定义一个变量接收一下。接着你就可以对table变量处理获取有效值。 ## 待解析的JSON字符串处理 我们在demo中自己添加了一些JSON有效字符串,想解析出有效数据。这就需要注意JSON字符串怎么加进代码里。如下要将下面这段数据解析出来: {"date":"2021-04-09","text_day":"多云","code_day":"4","text_night":"多云","code_night":"4","high":"18","low":"6","rainfall":"0.1","precip":"","wind_direction":"东","wind_direction_degree":"90","wind_speed":"15.3","wind_scale":"3","humidity":"41"} 我们需要先把这个赋值给一个变量接收。但你会发现,JSON字符串里的双引号将你的一整段数据分隔开来,这样是不行的。所以我们要借助转义字符“\”,在双引号前都加上转移字符就行了(整条数据记得用双引号括住,且不要加转义字符)如下 ```lua local date="{\"date\":\"2021-04-09\",\"text_day\":\"多云\",\"code_day\":\"4\",\"text_night\":\"多云\",\"code_night\":\"4\",\"high\":\"18\",\"low\":\"6\",\"rainfall\":\"0.1\",\"precip\":\"\",\"wind_direction\":\"东\",\"wind_direction_degree\":\"90\",\"wind_speed\":\"15.3\",\"wind_scale\":\"3\",\"humidity\":\"41\"}" ``` # 示例 > 详细的API demo见[JSON demo章节](http://doc.openluat.com/wiki/21?wiki_page_id=2178) JSON的两个功能演示:JSON编译和JSON解析 1.JSON编译: ```lua local torigin = { KEY1 = "VALUE1", KEY2 = "VALUE2", KEY3 = "VALUE3", KEY4 = "VALUE4", KEY5 = {KEY5_1="VALU5_1",KEY5_2="VALU5_2"}, KEY6 = {1,2,3}, } local jsondata = json.encode(torigin) --[[ jsondata 的值: {"KEY3":"VALUE3","KEY4":"VALUE4","KEY2":"VALUE2","KEY1":"VALUE1","KEY5":{"KEY5_2":"VALU5_2","KEY5_1":"VALU5_1"}},"KEY6":[1,2,3]} ]] ``` * 先是定义了一个torigin的table变量来存有效数据,这里需要注意是table类型。接下来直接调用JSON编译函数json.encode(torigin),并把返回值赋给jsondata 。JSON编译函数返回的是编译后的JSON有效字符串。 2.JSON解析: ```lua -- 正确json字符串 local wrongOrigin = "{\":\"VALUE3\",\"KEY4\":\"VALUE4\",\"KEY2\":\"VALUE2\",\"KEY1\":\"VALUE1\",\"KEY5\":{\"KEY5_2\":\"VALU5_2\",\"KEY5_1\":\"VALU5_1\"},\"KEY6\":[1,2,3]}" local origin = "{\"KEY3\":\"VALUE3\",\"KEY4\":\"VALUE4\",\"KEY2\":\"VALUE2\",\"KEY1\":\"VALUE1\",\"KEY5\":{\"KEY5_2\":\"VALU5_2\",\"KEY5_1\":\"VALU5_1\"},\"KEY6\":[1,2,3]}" local tjsondata,result,errinfo = json.decode(origin) if result then print(tjsondata["KEY1"]) print(tjsondata["KEY2"]) print(tjsondata["KEY3"]) print(tjsondata["KEY4"]) print(tjsondata["KEY5"]["KEY5_1"],tjsondata["KEY5"]["KEY5_2"]) print(tjsondata["KEY6"][1],tjsondata["KEY6"][2],tjsondata["KEY6"][3]) else print("json.decode error",errinfo) end --origin:正确输出 --wrongOrigin:json.decode error Expected colon but found invalid token at character 5 ``` * 这个代码对比了错误JSON字符串和JSON正确字符串的解析结果。先是定义了一个错误的JSON字符串,然后定义了一个正确的(注意转义字符的使用)。然后定义了三个变量来接受JSON解析函数的返回值。local tjsondata,result,errinfo = json.decode(origin),第一个返回值是解析出来的内容,table类型,第二个是解析结果,bool类型,第三个是错误信息。如果一切成功解析出结果,你就可以打印出解析出的数据了,如果解析失败则会返回失败信息。这里只测试了正确的JSON字符串,可以更换json.decode(origin)的参数,测试一下错误JSON字符串的情况。 # 常见问题 1.自己添加的JSON字符串解析失败 搜索JSON解析网页,先把这段JSON字符串放进网页里看JSON格式是否正确。如果正确,在看看自己代码里的转义字符有没有加对加全。 2.json.encode()这个api生成的json顺序是随机的吗? 是的 # JSON相关资料 [JSON API说明](https://doc.openluat.com/wiki/21?wiki_page_id=2261) [JSON demo讲解](http://doc.openluat.com/wiki/21?wiki_page_id=2178)