2013-07-25 60 views
2

所以我用一些嵌入式json解析了一個非常大的日誌文件。在python中,有沒有辦法提取嵌入的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解析器?

+0

請問JSON字符串的結束正好是'}」'? – Brian

+0

您是否準確例如代表着什麼行真正的樣子,報價-style和all?因爲如果是這樣,它實際上並不是有效的json,不管你做什麼,你都很難用任何標準的json庫解析它。 – Jorenko

回答

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) 
0

匹配它周圍的一切。

>>> re.search('^foo="(.*)" a=.+ c=.+$', 'foo="{my_object:foo, bar:baz}" a=b c=d').group(1) 
'{my_object:foo, bar:baz}' 
+0

好主意,除了我們不知道下面的鍵是什麼或通向json字符串的密鑰是 –

+0

最糟糕的格式。 –

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'}} 
相關問題