只解析一个json级别

时间:2012-08-30 11:23:09

标签: python json

我有以下字符串:

'{
    "key1": "val1",
    "key2": ["a","b", 3],
    "key3": {"foo": 27, "bar": [1, 2, 3]}
}'

我想只解析一个级别,所以结果应该是带键的一级字典,而值应该只是一个字符串(不需要解析它)

对于给定的字符串,它应该返回以下字典:

{
    "key1": "val1",
    "key2": "['a','b', 3]",
    "key3": "{'foo': 27, 'bar': [1, 2, 3]}"
}

有快速的方法吗?不将整个字符串解析为json并将所有值转换回字符串。

3 个答案:

答案 0 :(得分:3)

几乎没有答案,但我只看到两种可能性:

  1. 加载完整的JSON并转储您在问题中排除的值
  2. 通过将值包装在引号中来修改内容,以便JSON加载产生字符串值
  3. 老实说,我认为没有'性能关键 JSON解析代码',它只是听起来不对,所以我选择第一个选项。

答案 1 :(得分:3)

我认为你可以使用正则表达式解决这个问题,它对我有用:

import re
pattern = re.compile('"([a-zA-Z0-9]+)"\s*:\s*(".*"|\[.*\]|\{.*\})')    
dict(re.findall(pattern, json_string))

但我不知道这是否更快,您需要尝试使用您的数据。

[编辑]

是的,它更快。我尝试了下面的脚本,正则表达式版本的速度提高了5倍。

使用json模块:

import json

val='''
{
    "key1": "val1",
    "key2": ["a","b", 3],
    "key3": {"foo": 27, "bar": [1, 2, 3]}
}
'''

for n in range(100000):
    dict((k,json.dumps(v)) for k,v in json.loads(val).items())

使用正则表达式:

import re

val='''{
    "key1": "val1",
    "key2": ["a","b", 3],
    "key3": {"foo": 27, "bar": [1, 2, 3]}
}'''

pattern = re.compile('"([a-zA-Z0-9]+)"\s*:\s*(".*"|\[.*\]|\{.*\})')    
for n in range(100000):
    dict(re.findall(pattern, val))

答案 2 :(得分:0)

我现在不是,如果它真的是你需要的,但试试

>>> import json
>>> val = """
... {
... "key1": "val1",
... "key2": ["a","b", 3],
... "key3": {"foo": 27, "bar": [1, 2, 3]}
... }
... """
>>> dict((k,json.dumps(v)) for k,v in json.loads(val).items())
{u'key3': '{"foo": 27, "bar": [1, 2, 3]}', u'key2': '["a", "b", 3]', u'key1': '"val1"'}

这有点棘手,导致您加载到JSON完整对象,而不仅仅是在字典中转储值。