使用Unix工具解析JSON

使用Unix工具解析JSON

我正在尝试解析从curl请求返回的JSON,如下所示:


curl 'http://twitter.com/users/username.json' |

    sed -e 's/[{}]/''/g' | 

    awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'

以上将JSON拆分为字段,例如:


% ...

"geo_enabled":false

"friends_count":245

"profile_text_color":"000000"

"status":"in_reply_to_screen_name":null

"source":"web"

"truncated":false

"text":"My status"

"favorited":false

% ...

如何打印特定字段(用-v k=text?表示)?


慕工程0101907
浏览 783回答 4
4回答

繁星点点滴滴

要快速提取特定键的值,我个人喜欢使用“grep -o”,它只返回正则表达式的匹配。例如,要从推文中获取“文本”字段,请执行以下操作:grep&nbsp;-Po&nbsp;'"text":.*?[^\\]",'&nbsp;tweets.json这个正则表达式比你想象的更强大;&nbsp;例如,它可以很好地处理嵌入了逗号并在其中包含转义引号的字符串。我认为通过更多的工作,你可以制作一个实际上可以保证提取值,如果它是原子的。(如果它有嵌套,那么正则表达式当然不能这样做。)为了进一步清洁(虽然保持弦的原始逃逸),你可以使用类似的东西:| perl -pe 's/"text"://; s/^"//; s/",$//'。(我为此分析做了这个。)对于所有坚持你的仇敌应该使用真正的JSON解析器 - 是的,这对正确性至关重要,但是要做一个非常快速的分析,比如计算值以检查数据清理错误或获得对数据的一般感觉,在命令行上敲打一些东西会更快。打开编辑器编写脚本会分散注意力。grep -o比Python标准json库快几个数量级,至少在为推文(每个约2 KB)执行此操作时。我不确定这是不是因为json速度慢(我应该在某个时候与yajl比较);&nbsp;但原则上,正则表达式应该更快,因为它是有限状态并且更加可优化,而不是必须支持递归的解析器,并且在这种情况下,为您不关心的结构花费大量CPU构建树。(如果有人写了一个有限状态传感器,它做了适当的(深度限制的)JSON解析,那就太棒了!同时我们有“grep -o”。)要编写可维护的代码,我总是使用真正的解析库。我没有尝试过jsawk,但是如果它运行良好,那将解决点#1。最后一个更糟糕的解决方案:我编写了一个脚本,它使用Python&nbsp;json并将所需的键提取到以制表符分隔的列中;&nbsp;然后我通过一个包装器管道awk,允许对列进行命名访问。&nbsp;在这里:json2tsv和tsvawk脚本。所以对于这个例子,它将是:json2tsv&nbsp;id&nbsp;text&nbsp;<&nbsp;tweets.json&nbsp;|&nbsp;tsvawk&nbsp;'{print&nbsp;"tweet&nbsp;"&nbsp;$id&nbsp;"&nbsp;is:&nbsp;"&nbsp;$text}'这种方法没有解决#2问题,比单个Python脚本效率更低,而且有点脆弱:它强制对字符串值中的换行符和制表符进行规范化,以便与awk的字段/记录分隔的世界视图一起使用。但它确实让你留在命令行,更正确grep -o。
打开App,查看更多内容
随时随地看视频慕课网APP