用正则解析 json

2017-04-24 20:52:20 +08:00
 einvince

要处理 json 日志文件,因为特殊原因不能使用 json 直接解析,只能只用正则表达式 现在遇到的问题是,每个 json 语句里的 key ,不完全一样,比如 uid ,有的有,有的没有 应该怎么写这样的正则,判断下存不存在,如果存在就匹配?

2863 次点击
所在节点    问与答
12 条回复
kyuuseiryuu
2017-04-24 22:03:42 +08:00
歪个楼:比较好奇是什么特殊原因
geelaw
2017-04-24 22:12:48 +08:00
麻烦学习一下计算理论再来想这么简单的限制下可不可能做得了。

你的 JSON 必须符合一些特别精细的要求,以致该种内容可以用正则语言搞定才能用正则表达式。

另外,你所谓的“存在就匹配”,你想匹配什么内容呢?
sagaxu
2017-04-24 22:13:08 +08:00
@kyuuseiryuu 一般这种所谓特殊原因,都是错的
yangqi
2017-04-24 22:23:18 +08:00
正则不是用来解析的,不要想了
einvince
2017-04-24 22:33:30 +08:00
@geelaw @sagaxu @yangqi @kyuuseiryuu
特殊的原因是想使用阿里云的日志服务
因为想把历史的日志都传过去,所以时间不能使用系统时间,得使用日志里的时间,直接使用 json 格式上传,阿里需要提供 time 的 key 来获得 time ,尴尬的是,现在是日志格式是
2017-03-24:{
x:1
y:2
z:3
}
时间是 key ,不是 value
除了 json 之外,还可以使用正则提取,所以想用正则,但是每条日志里的 key 多少都不一样
kyuuseiryuu
2017-04-24 22:38:33 +08:00
@einvince 遍历 keyset 啊,如果 key 对应的 value 还是个 object , 那就递归进去遍历咯。然后对于每个 value 类型 活着 key 类型写判断对应的处理方法。
sagaxu
2017-04-24 22:44:21 +08:00
@einvince 你这根本就不是 json 格式, key 作为 string ,竟然没有放在引号里面。如果用 YAML ,或许能通过校验。
geelaw
2017-04-24 22:45:15 +08:00
那并不是你不能用一般的方式解析 JSON ,只是你不想。 Case closed.
sunjourney
2017-04-25 09:13:03 +08:00
正则解析 json 做不到的,除非格式全部一致(也就是你能保证全是你列的格式, key 的数目和顺序一致),更何况你写的都不是 json 。最主要解析完你是存成什么,存的数据格式的语言不支持 json parse ? 可以说来听听?你能好好分析一下的话可以自己写 log parser ,每行用正则匹配一下还是可以的
einvince
2017-04-25 10:35:13 +08:00
@sunjourney
http://ok68fpa49.bkt.clouddn.com/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20170425103403.png
http://ok68fpa49.bkt.clouddn.com/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20170425103021.png
看图,使用阿里的日志服务,它提供了 json 格式,但是我们的 time 是 key ,所以不能用这个
只能用正则提取,然后让它给转换,但是每条日志的格式不一致,就像 uid ,用户未登陆就没有
sunjourney
2017-04-25 14:55:24 +08:00
time 不是 key , time 后面括号里的是 json ,你写在 5 楼的不是 json , json 的 key 必须有双引号。那个 time 的作用是告诉你那个时间的的日志 json ,不要当成 json 本身,你给的图的信息足够转换了,用日期正则把日期捕获删掉解析剩下的或者把日期后面的捕获了解析就成了。
einvince
2017-04-25 19:31:20 +08:00
@sunjourney 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/357083

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX