所以我用一些嵌入式json解析一个非常大的日志文件。
所以我会看到这样的行
foo="{my_object:foo, bar:baz}" a=b c=d
问题在于,由于内部json可以有空格,但是在JSON之外,空格充当元组分隔符(除非它们有不带引号的字符串。无论白痴认为这是一个好主意的Huzzah),我不是确定如何在不重新实现json解析器的大部分的情况下找出JSON字符串的结尾。
是否有一个Python的json解析器,我可以给它'{"my_object":"foo", "bar":"baz"} asdfasdf'
,它可以返回({'my_object' : 'foo', 'bar':'baz'}, 'asdfasdf')
或者我将不得不手动重新实现json解析器?
答案 0 :(得分:0)
匹配周围的一切。
>>> re.search('^foo="(.*)" a=.+ c=.+$', 'foo="{my_object:foo, bar:baz}" a=b c=d').group(1)
'{my_object:foo, bar:baz}'
答案 1 :(得分:0)
类似的东西:
import shlex
import json
def decode_line(line):
decoded = {}
fields = shlex.split(line)
for f in fields:
k, v = f.split('=', 1)
if k == "foo":
v = json.loads(v)
decoded[k] = v
return decoded
这确实假设引号内的JSON被正确引用。
这是一个使用上述内容的简短示例程序:
import pipes
testdict = {"hello": "world", "foo": "bar"}
line = 'foo=' + pipes.quote(json.dumps(testdict)) + ' a=b c=d'
print line
print decode_line(line)
输出:
foo='{"foo": "bar", "hello": "world"}' a=b c=d
{'a': 'b', 'c': 'd', 'foo': {u'foo': u'bar', u'hello': u'world'}}
答案 2 :(得分:0)
找到一个非常酷的答案。使用json.JSONDecoder的scan_once函数
In [30]: import json
In [31]: d = json.JSONDecoder()
In [32]: my_string = 'key="{"foo":"bar"}"more_gibberish'
In [33]: d.scan_once(my_string, 5)
Out[33]: ({u'foo': u'bar'}, 18)
In [37]: my_string[18:]
Out[37]: '"more_gibberish'
小心点
In [38]: d.scan_once(my_string, 6)
Out[38]: (u'foo', 11)