利用lua中的string.gsub来巧妙实现json中字段的正则替换

原创 2016年05月30日 14:27:29

业务需求

工作中需要对某个请求的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/lua

function 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)

运行截图


版权声明:本文为博主原创文章,未经博主允许不得转载。

shell编写的垃圾回收站

源文 http://blog.chinaunix.net/u1/40306/index.html 以前用shell写过一个rm但是并没有恢复功能,前一阵cu论坛上有个网友说能不能增加一个功能就是把删...
  • zxy_cs
  • zxy_cs
  • 2011年11月24日 15:58
  • 771

Ruby on Rails总结(三)

1、Ruby中将一个字符串的首字母变为大写capitalize()方法          字符串.capitalize          例如: def say_goodmorning(name...

通过Mybatis拦截器巧妙实现通用查询打破实体与字段对应关系

最近两天项目需求研究了一下mybatis拦截器。对于Mybatis拦截器发现其功能强大,虽很灵活但是其内部对象转换太麻烦很多接口没有完全暴露出来。甚至不得不通过反射的方式去取其内部关联对象。可能Myb...

String类replaceAll方法正则替换深入分析

背景:       前几天有人发了一个关于下面问题的贴,对这个有点好奇,故花时间做了点研究。          对单个反斜杠字符串替换成双斜杠的Java实现如下:     String s =...

反射实例-Field,将类中String字段中的b全部替换成a

简要说明: 该段代码通过一个简单的例子来说明

利用CountDownTimer巧妙地实现倒计时功能

说到简单实现一个倒计时功能大家可能觉得这还不简单,分分钟搞定的事情啊,线程+handler,so easy 来我们先简单看一下实现效果: 代码布局很简单,layout_main.xml如下...

原生态Ajax写法异步提交,巧妙利用innerHTML实现不清空原来内容追加请求结果

一、Ajax核心代码解析             Ajax的调用方法可以通过onclick、onchange等鼠标和键盘的事件来触发。此处不做叙述。直接看Ajax的核心代码。 ...

Lua语言中字符串String实现原理

本文来自 Lua Programming Gems 图书的第二节。 由Lua语言作者编写的Lua Performance Tips 节选而来。...

String字符串注入类静态字段

  • 2008年08月02日 11:13
  • 5KB
  • 下载

Python脚本10 —— 复制json文件并替换指定字段

需求: 三个服务器都需要一套json文件,但是只有一个字段内容不相同。维护三份成本太高。于是想写一个脚本,只维护一套json文件,然后根据这个json文件生成另外两个服务器对应的json文件。...
  • hzxpyjq
  • hzxpyjq
  • 2015年09月22日 13:47
  • 1952
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用lua中的string.gsub来巧妙实现json中字段的正则替换
举报原因:
原因补充:

(最多只允许输入30个字)