免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 24070 | 回复: 22
打印 上一主题 下一主题

[学习共享] 介绍几个处理 JSON 文件的利器 [复制链接]

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-11 13:14 |只看该作者 |倒序浏览
本帖最后由 rdcwayx 于 2014-03-13 07:47 编辑

不清楚这个坛子里用到json的多不多。 有现成的perl/python模块可用,可以优先考虑。如果考虑用 shell/awk/sed 来提取json文件里的信息的话,可以,但是比较费时费力。这里我推荐几个工具 (部分就是用shell/awk/sed写的),如果你碰上类似的JSON文件处理的话,可以省去很多时间。

先来看一下JSON 文件格式,看这里的介绍
http://en.wikipedia.org/wiki/JSON

json首页也有很多介绍:
http://json.org/
  1. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
复制代码
这篇文章有中文介绍http://tjbmx0987.iteye.com/blog/225755

贴出个典型的例子,后面会用上:

sample1.json
  1. {
  2.     "firstName": "John",
  3.     "lastName": "Smith",
  4.     "age": 25,
  5.     "address": {
  6.         "streetAddress": "21 2nd Street",
  7.         "city": "New York",
  8.         "state": "NY",
  9.         "postalCode": 10021
  10.     },
  11.     "phoneNumbers": [
  12.         {
  13.             "type": "home",
  14.             "number": "212 555-1234"
  15.         },
  16.         {
  17.             "type": "fax",
  18.             "number": "646 555-4567"
  19.         }
  20.     ]
  21. }
复制代码
JSON 的格式可以通过一些在线工具审核,因为如果写得不正确的话,后面介绍的处理工具可能会出错。

http://jsonlint.com/
http://www.freeformatter.com/json-validator.html

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2014-03-11 13:14 |只看该作者
本帖最后由 rdcwayx 于 2014-03-12 18:31 编辑

第一个利器:
1. JQ

http://stedolan.github.io/jq/
具体怎么安装我就不介绍了,网页上都有, 从下面的例子可以大致了解一下这个工具的用途,比如:

  1. # 查询 firstName
  2. $ jq '.firstName' sample1.json     
  3. "John"
复制代码
  1. # 查询 age 以及 第二个电话号码
  2. $ jq '.age , .phoneNumbers[1]' sample1.json   
  3. 25
  4. {
  5.   "number": "646 555-4567",
  6.   "type": "fax"
  7. }
复制代码
  1. 查询符合家庭(home)的电话号码(phoneNumbers)
  2. $ jq '.phoneNumbers[]|select (.type=="home")' sample1.json   
  3. {
  4.   "number": "212 555-1234",
  5.   "type": "home"
  6. }
复制代码
还有很多方法,自己 man一下吧。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2014-03-11 13:15 |只看该作者
本帖最后由 rdcwayx 于 2014-03-12 18:43 编辑

第二个利器

jsawk (jsawk: It's like awk for JSON, in bash.)

主页: https://github.com/micha/jsawk

安装:
  1. curl -L http://github.com/micha/jsawk/raw/master/jsawk > jsawk
  2. chmod 755 jsawk && mv jsawk ~/bin/
复制代码
jsawk是个脚本文件,一千多行。如果你有兴趣和时间的话,可以阅读一下jsawk的内容,或许还能在里面挑错或者提出改进意见。
  1. $ wc -l jsawk
  2. 1327 jsawk
复制代码
但在用这个脚本前,要先安装js
  1. apt-get install spidermonkey-bin
复制代码
否则运行jsawk时会有报错:  "js: command not found"

开始举例:
  1. #取一个属性
  2. $ jsawk 'return this.firstName' < sample1.json
  3. John
  4. # 取多个属性
  5. $ jsawk -n 'out(this.firstName,this.lastName)' < sample1.json
  6. ["John","Smith"]
复制代码
  1. #将年龄增加一岁 (这个功能比上面介绍的jq要强大很多)。
  2. $ jsawk 'this.age++' < sample1.json
  3. {"firstName":"John","lastName":"Smith","age":26,"address":{"streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":10021},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"fax","number":"646 555-4567"}]}
复制代码
  1. # 返回年龄小于30岁的名字
  2. $ jsawk 'if (this.age <= 30) return this.firstName' < sample1.json
  3. John
复制代码
  1. # 这里我想取出电话号码,但是要用到两次jsawk命令,大家看看有没有改进的地方
  2. $ jsawk 'return this.phoneNumbers' < sample1.json |jsawk 'return this.number'
  3. ["212 555-1234","646 555-4567"]
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
4 [报告]
发表于 2014-03-11 13:15 |只看该作者
本帖最后由 rdcwayx 于 2014-03-13 07:50 编辑

JSON.sh  (a pipeable JSON parser written in Bash)
https://github.com/dominictarr/JSON.sh

这个工具写的要简单些,思路和上面的工具稍有不同。但是我个人觉得反而更适合shell板块的人使用,因为你可以有自己的发挥。
  1. $ ./JSON.sh -l < file
  2. ["firstName"]   "John"
  3. ["lastName"]    "Smith"
  4. ["age"] 25
  5. ["address","streetAddress"]     "21 2nd Street"
  6. ["address","city"]      "New York"
  7. ["address","state"]     "NY"
  8. ["address","postalCode"]        10021
  9. ["phoneNumbers",0,"type"]       "home"
  10. ["phoneNumbers",0,"number"]     "212 555-1234"
  11. ["phoneNumbers",1,"type"]       "fax"
  12. ["phoneNumbers",1,"number"]     "646 555-4567"
复制代码
通过这样的转换, 你就可以方便的用grep 来查询了,而这个grep命令是shell板块的强项。
  1. $ ./JSON.sh -l < file  |grep firstName
  2. ["firstName"]   "John"

  3. $ ./JSON.sh -l < file  |grep type
  4. ["phoneNumbers",0,"type"]       "home"
  5. ["phoneNumbers",1,"type"]       "fax"
复制代码
这个不带参数的,有更多的输出,看你自己的需求。
  1. $ ./JSON.sh < file
  2. ["firstName"]   "John"
  3. ["lastName"]    "Smith"
  4. ["age"] 25
  5. ["address","streetAddress"]     "21 2nd Street"
  6. ["address","city"]      "New York"
  7. ["address","state"]     "NY"
  8. ["address","postalCode"]        10021
  9. ["address"]     {"streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":10021}
  10. ["phoneNumbers",0,"type"]       "home"
  11. ["phoneNumbers",0,"number"]     "212 555-1234"
  12. ["phoneNumbers",0]      {"type":"home","number":"212 555-1234"}
  13. ["phoneNumbers",1,"type"]       "fax"
  14. ["phoneNumbers",1,"number"]     "646 555-4567"
  15. ["phoneNumbers",1]      {"type":"fax","number":"646 555-4567"}
  16. ["phoneNumbers"]        [{"type":"home","number":"212 555-1234"},{"type":"fax","number":"646 555-4567"}]
  17. []      {"firstName":"John","lastName":"Smith","age":25,"address":{"streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":10021},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"fax","number":"646 555-4567"}]}

  18. $ ./JSON.sh < file  |grep "type.*number"
  19. ["phoneNumbers",0]      {"type":"home","number":"212 555-1234"}
  20. ["phoneNumbers",1]      {"type":"fax","number":"646 555-4567"}
  21. ["phoneNumbers"]        [{"type":"home","number":"212 555-1234"},{"type":"fax","number":"646 555-4567"}]
  22. []      {"firstName":"John","lastName":"Smith","age":25,"address":{"streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":10021},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"fax","number":"646 555-4567"}]}

复制代码
一共四个参数,自己要用到的时候,查一下即可上手。
  1. $ ./JSON.sh -h

  2. Usage: JSON.sh [-b] [-l] [-p] [-h]

  3. -p - Prune empty. Exclude fields with empty values.
  4. -l - Leaf only. Only show leaf nodes, which stops data duplication.
  5. -b - Brief. Combines 'Leaf only' and 'Prune empty' options.
  6. -h - This help text.
复制代码
另外还推荐了一个jsonv.sh的小工具,主要是用来将JSON转换成CSV文件的,有兴趣的话,就自己看看吧。

jsonv.sh - A Bash command line tool for converting JSON to CSV
https://github.com/archan937/jsonv.sh

论坛徽章:
2
水瓶座
日期:2014-02-28 14:20:09辰龙
日期:2014-06-16 13:18:51
5 [报告]
发表于 2014-03-11 13:19 |只看该作者
坐等更新

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2014-03-11 13:30 |只看该作者
之前有不少人来求json格式处理,现在有了这些利器,就可以让他们直接来这里找了,果断收藏~

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
7 [报告]
发表于 2014-03-11 13:50 |只看该作者
收藏先,多谢楼主!

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
8 [报告]
发表于 2014-03-11 14:01 |只看该作者
收藏了,我去..版版你太给力了..

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
9 [报告]
发表于 2014-03-12 09:07 |只看该作者
学习了,一般不用shell处理这种东西

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
10 [报告]
发表于 2014-03-12 09:41 |只看该作者
精品贴!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP