3

そのため、json が埋め込まれた非常に大きなログ ファイルを解析しています。

だから私はこのような行が表示されます

foo="{my_object:foo, bar:baz}" a=b c=d

問題は、内部 json にはスペースを含めることができるが、JSON の外部では、スペースがタプル区切り文字として機能することです (引用符で囲まれていない文字列がある場合を除きます。馬鹿がそれを良い考えだと思った場合はハザー)、どうすればよいかわかりません。 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 に答える