天涼好個秋.

lua解析json

1670 阅 0 评 问题&解决方案

起因

还是因为Bing插件,之前使用的获取图片链接的第三方api今天down掉了,所以只能另求解决办法,便想起了官方的api,但是官方的api返回的数据是json,所以需要从json中解析出图片的下载链接,所以本文由此而来。

为什么是lua

尝试使用几种方案来解决问题。

shell

shell处理字符串的方法来解析。
+ 优点:简单快捷。
+ 缺点:如果json数据有变动可能会导致以后不兼容。

jsonfilter

openwrt下有对应的编译好的软件包,很好用。
+ 优点:使用简单,专门用来解析json的工具。
+ 缺点:需要引入新的ipk,或者二进制文件,不够环保(12K左右)。

lua

强大的lua语言,而且看了下极路由的rom,自带的cjson,完美。
+ 优点:无需引入新的文件,而且同样标准化的解析json,不会有shell字符串解析的局限。
+ 缺点:因为我还不知道怎么让shell和lua交互,所以要另外写一个lua脚本文件(其实不算啥缺点,是博主能力不足)。

下面是代码

这里的json以bing提供的接口为例。

local cjson = require "cjson";
local json = [[{"images":[{"startdate":"20160807","fullstartdate":"201608070700","enddate":"20160808","url":"/az/hprichbg/rb/ChicagoHarborLH_ROW12062508172_1920x1080.jpg","urlbase":"/az/hprichbg/rb/ChicagoHarborLH_ROW12062508172","copyright":"Chicago Harbor Light on Lake Michigan (© Tim Klein/Gallery Stock)","copyrightlink":"javascript:void(0)","copyrightsource":"© Tim Klein/Gallery Stock","wp":true,"hsh":"75d78eb58afb2b9429daabd914040694","drk":1,"top":1,"bot":1,"hs":[]}],"tooltips":{"loading":"正在加载...","previous":"上一个图像","next":"下一个图像","walle":"此图片不能下载用作壁纸。","walls":"下载今日美图。仅限用作桌面壁纸。"}}]];
local data = cjson.decode(json);
local url = data["images"][1]["url"];
print(url);

这样就获得了url字段的值。

能提出多个解决方案,找出最适合当前情况的最优解。

EOF