Lua JSON

JSON

简介

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格局。它基于ECMAScript的一个子集。 JSON选用完全独立于言语的文本格局,但是也使用了类似于C言语宗族的习气(包含C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使json调试成为抱负的数据交换言语。 易于人阅览和编写,同时也易于机器解析和生成(一般用于提高网络传输速率)。

API说明

详细的API介绍见JSON API章节

实现流程

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字符串里的双引号将你的一整段数据分隔开来,这样是不行的。所以我们要借助转义字符“\”,在双引号前都加上转移字符就行了(整条数据记得用双引号括住,且不要加转义字符)如下

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章节

JSON的两个功能演示:JSON编译和JSON解析
1.JSON编译:

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解析:

-- 正确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格式是否正确。如果正确,在看看自己代码里的转义字符有没有加对加全。

相关资料以及购买链接

JSON相关资料

JSON API说明

JSON demo讲解

相关开发板购买链接

Air724UG开发板

Air724 开发板使用说明

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值