我正在寻找从格式不正确的json获得的密钥对,因此我无法使用jq或其他方法来获取JSON密钥值对。另外,数据不会按特定顺序打印,因此我无法通过特定的列或字段号来获取数据。
做到这一点的最佳方法是什么?我在构建正则表达式或使用cut使其正常工作时遇到问题。
root# python3 getprice.py
{'bid': '11546.94', 'ask': '11551.96', 'volume': {'USD': '51726566.064352112368', 'TLC': '4388.676466043', 'timestamp': 1561785300000}, 'last': '11551.96'}
root# python3 getprice.py
{'last': '11551.96', 'bid': '11546.94', 'ask': '11551.96', 'volume': {'timestamp': 1561785300000, 'USD': '51726566.064352112368', 'TLC': '4388.676466043'}}
root# python3 getprice.py
{'bid': '11547.44', 'ask': '11551.96', 'volume': {'TLC': '4388.676466043', 'timestamp': 1561785300000, 'USD': '51726566.064352112368'}, 'last': '11551.96'}
答案 0 :(得分:2)
它看起来像JSON,但带有引号。如果您的文件是这样的:
$ cat file.txt
{'bid': '11546.94', 'ask': '11551.96', 'volume': {'USD': '51726566.064352112368', 'TLC': '4388.676466043', 'timestamp': 1561785300000}, 'last': '11551.96'}
然后您可以:
$ cat file.txt | tr "'" '"' | jq '.'
{
"bid": "11546.94",
"ask": "11551.96",
"volume": {
"USD": "51726566.064352112368",
"TLC": "4388.676466043",
"timestamp": 1561785300000
},
"last": "11551.96"
}
或者只是为了获得一个ask
值:
$ cat file.txt | tr "'" '"' | jq '.ask'
"11551.96"
答案 1 :(得分:0)
除了编写自己的自定义解析器之外,解析数据的最简单方法可能是在node.js中eval
(一种在JSON.parse()
之前解析JSON的旧技术):
#! /usr/bin/env node
// A simple script to parse javascript objects from stdin (not just JSON)
// Pass the key you want to extract as argument:
let key = process.argv[2];
let rawData = '';
process.stdin.on('data', x => rawData += x.toString());
process.stdin.on('end',() => {
eval('var obj = ' + rawData); // CAREFUL - EVAL IS EVIL!!!
console.log(eval 'obj.' + key); // ALSO EVIL!
});
将以上脚本另存为'jsonparse'
并使其可执行。然后,您可以像这样使用它:
python3 getprice.py | jsonparse bid
python3 getprice.py | jsonparse volume.USD