13

我有以下字符串:

'{
    "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 并将所有值转换回字符串。

4

3 回答 3

4

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

  1. 加载完整的 JSON 并转储您在问题中排除的值
  2. 通过将值括在引号中来修改内容,以便 JSON 加载产生字符串值

老实说,我认为没有“性能关键的JSON 解析代码”之类的东西,它只是听起来不对,所以我会选择第一个选项。

于 2012-08-30T12:18:27.020 回答
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))
于 2012-08-30T13:45:55.923 回答
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 完整对象,而不仅仅是在字典中转储值。

于 2012-08-30T11:57:17.487 回答