本文主要是介绍利用lua中的string.gsub来巧妙实现json中字段的正则替换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
业务需求
工作中需要对某个请求的json响应中的某个字段进行替换, 通常想到的方法是,先使用lua的cjson模块解析该json响应, 取出该json字段再该改写它的值.
在这样实现的过程中,遇到一些问题,表现如下:
(1).上面的方法需要经过json解码, 修改字段值, json编码的过程, 在json编码过程中, 会将完整的url进行转义,比如
http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4
会被转义为
http:\/\/101.227.23.53\/videos\/v0\/20151026\/88\/fc\/8adcec584a283b2ce0aacb15092918f5.mp4
这不是我们需要的,因为我们还需要将\去掉,比较繁琐;
(2).有些响应是js片段, 而不是标准的json
这样套用cjson处理的话,将会出错, 而且实际线上的情况非常复杂, 异常处理非常不好处理, 比如, 可能返回这样的响应
var videoUrl={code:"A00000",data:{"l":"http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4?key=8446d65833da155a&src=iqiyi.com&qypid=411714900_33&v=851447025&qd_src=app&qd_tm=1463727282000&qd_ip=117.146.18.238&qd_sc=ebde1fe754678856abc597e7c689b19e&mbd=10020202ddf238a3ed4b7fbac0e1c989_4.9.1_&uuid=759240d6-573eb992-3d","t":"CMNET|XinJiang-117.146.64.214","z":"xinjiang_cmnet","h":"0","e":"0"}};
或者
[{"fileid":"030008070057160DFAB40F32C1770EA3DF4CF3-E4DF-28B8-FCCE-3EDFBEB73802.mp4","server":"http://111.206.106.204/youku/69780130BBF468394EFD494E56/030008070057160DFAB40F32C1770EA3DF4CF3-E4DF-28B8-FCCE-3EDFBEB73802.mp4"}]
解决方法
放弃json的解码和编码, 直接采用字符串的正则匹配替换.这样处理更简练
下面是处理源码
#!/usr/bin/luafunction mod_hosts(h, s)return h .. "10.10.110.162:8081/" .. s .. "/acjf92lbq/"
end--利用正则匹配来替换指定部分的host字段
s = 'var videoUrl={code:"A00000",data:{"l":"http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4?key=8446d65833da155a&src=iqiyi.com&qypid=411714900_33&v=851447025&qd_src=app&qd_tm=1463727282000&qd_ip=117.146.18.238&qd_sc=ebde1fe754678856abc597e7c689b19e&mbd=10020202ddf238a3ed4b7fbac0e1c989_4.9.1_&uuid=759240d6-573eb992-3d","t":"CMNET|XinJiang-117.146.64.214","z":"xinjiang_cmnet","h":"0","e":"0"}};'
l = string.gsub(s, '(\"l\"%s*:%s*\"http://)(.-)/', mod_hosts("%1", "%2"))
print(l)
运行截图
这篇关于利用lua中的string.gsub来巧妙实现json中字段的正则替换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!