在python中,是否有方法提取嵌入的json字符串?
因此,我正在解析一个非常大的日志文件,其中包含一些嵌入的json 我会看到这样的线条在python中,是否有方法提取嵌入的json字符串?,python,json,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”}asdf
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解析器 匹配周围的所有内容
>>> re.search('^foo="(.*)" a=.+ c=.+$', 'foo="{my_object:foo, bar:baz}" a=b c=d').group(1)
'{my_object:foo, bar:baz}'
使用和
比如:
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'}}
找到了一个很酷的答案。使用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)
JSON字符串的结尾是否恰好是
}“
?您的示例是否准确地表示了行的真实外观、引用样式以及所有内容?因为如果是这样的话,它实际上不是有效的json,无论你做什么,你都很难使用任何标准的json库来解析它。好主意,除了我们不知道下面的键是什么或者导致json字符串的键是什么。