我有一个巨大的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是要走的路,但是,因为它以一行的形式读取它,我发现它很棘手。
将这些字段拉出来的任何建议/代码示例?
答案 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有一些选项,做更多的东西,但这对我有用。