3

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

4

3 回答 3

1

找到了一个很酷的答案。使用 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)
于 2013-07-31T18:15:58.390 回答
0

匹配周围的一切。

>>> re.search('^foo="(.*)" a=.+ c=.+$', 'foo="{my_object:foo, bar:baz}" a=b c=d').group(1)
'{my_object:foo, bar:baz}'
于 2013-07-25T02:21:50.183 回答
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'}}
于 2013-07-25T02:32:48.577 回答