13

次の文字列があります。

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

1 つのレベルのみを解析したいので、結果はキーを持つ 1 つのレベルの辞書である必要があり、値は単なる文字列である必要があります (解析する必要はありません)。

指定された文字列に対して、次の辞書を返す必要があります。

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

それを行うための速い方法はありますか?文字列全体を json に解析せずに、すべての値を文字列に変換します。

4

3 に答える 3

4

答えはほとんどありませんが、2つの可能性しかありません。

  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 に答える