从命令行解析JSON数据

时间:2013-03-28 16:05:37

标签: json unix awk

我有一个巨大的JSON字符串,我试图通过命令行解析。

以下是一个例子:

"Product_ID":"productID_1","Price":"$4.99","Cover_Image":"cover.jpg"},{"issue_id":"2","total_article":"36","issue_number":"4","issue_name":"","volume":"57","editors":"","date_of_release":"2013-04-01"

列出了多个问题,所有问题都有相同的字段。我需要从JSON中的每篇文章中提取产品ID,价格和日期,并从命令行将其写入文本文件。

我认为awk是要走的路,但是,因为它以一行的形式读取它,我发现它很棘手。

将这些字段拉出来的任何建议/代码示例?

4 个答案:

答案 0 :(得分:1)

查看sql4json(http://github.com/bheni/sql4json

如前所述,这不是有效的json。如果你有一个名为inputfile.json的文件,其内容为:

[
   {"Product_ID":"productID_1","Price":"$1.99","Cover_Image":"cover1.jpg","issue_id":"4","total_article":"16","date_of_release":"2013-04-01"},
   {"Product_ID":"productID_2","Price":"$2.99","Cover_Image":"cover2.jpg","issue_id":"5","total_article":"26","date_of_release":"2013-04-02"},
   {"Product_ID":"productID_3","Price":"$3.99","Cover_Image":"cover3.jpg","issue_id":"6","total_article":"36","date_of_release":"2013-04-03"}
]

这应该可以满足您的需求:

sql4json --csv 'SELECT Price, Product_ID, date_of_release' <inputfile.json >outputfile.csv

outputfile.csv的内容为:

$1.99,productID_1,2013-04-01
$2.99,productID_2,2013-04-02
$3.99,productID_3,2013-04-03

答案 1 :(得分:0)

作为一项规则......试着抵制并避免自己解析事物的冲动。您的正则表达式可能与您的示例XML或JSON一起使用一次或两次,或者不是,但它是如此冒险!

这是使用Python而没有脚本来提取单个值的行:

davanbri@om: echo $J
{"a":"fish"}
davanbri@om: python -c "import json;print json.loads('$J')['a']"
fish

可能会满足您的需求!或者编写一个实际的python脚本并获取所需的所有值。

答案 2 :(得分:0)

你很可能已经安装了python,如果没有,安装它不会有什么坏处。

<强> printjson.py

import json;
import sys;
for obj in json.loads(sys.stdin.readline()):
    print obj['Product_ID']
    print obj['Price']

<强>使用

$ echo '[{"Product_ID":"productID_1","Price":"$4.99","Cover_Image":"cover.jpg"}]' | python printjson.py > outfile

$ cat outfile 
productID_1
$4.99

答案 3 :(得分:-1)

有一个很棒的工具可以与jq配合使用。通常需要过滤巨大的文件。所以我的工作流程是我用https://github.com/ilyash/show-struct/进行解析这是一个小工具,可以将你的巨型json变成这样的东西:

.Records -- (Array of 3 elements) .Records[] .Records[].awsRegion -- us-east-1 .Records[].eventName -- DescribeInstances1 。记录[] .eventSource - ec2.amazonaws.com`

然后你可以使用jq,例如。

aws ec2 describe- * | jq .Records []。eventName

JQ有一些选项,做更多的东西,但这对我有用。