在python中,有没有办法提取嵌入的json字符串?

时间:2013-07-25 01:57:30

标签: python json

所以我用一些嵌入式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解析器?

3 个答案:

答案 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)

使用shlexjson

类似的东西:

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)