2012-08-30 38 views
8

Tôi có chuỗi sau:Parse chỉ có một mức độ json

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

Tôi muốn phân tích chỉ trên mức nên kết quả phải là một từ điển một cấp với chìa khóa, và giá trị nên chỉ là một chuỗi (don' t cần phải phân tích nó)

Đối với chuỗi cho nó nên cho tôi sau từ điển:

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

có một cách nhanh chóng để làm điều đó? Không phân tích cú pháp toàn bộ chuỗi thành json và chuyển đổi tất cả các giá trị trở lại thành chuỗi.

+0

bạn đã phải phân tích chuỗi toàn bộ json, và lấy những phần chuỗi .. nó doable, nhưng tôi nghi ngờ nó có giá trị nỗ lực . Hiệu suất có thực sự quan trọng không? –

+0

có nó phải là một phần của mã quan trọng hiệu suất –

+0

Ngoài ra nếu tôi trực tiếp chuyển đổi từng giá trị thành str, tôi sẽ nhận được tiền tố u khó chịu cho các chuỗi: 'foo = json.loads ('{" key1 ":" val1 "," key2 " : ["a", "b", 3], "key3": {"foo": 27, "bar": [1, 2, 3]}} ') ' ' dict ([(k, str (v)) cho k, v trong foo.iteritems()]) ' sẽ cho tôi: ' {u'key1 ':' val1 ', u'key2': "[u'a ', u'b' , 3] ", u'key3 ':" {u'foo': 27, u'bar ': [1, 2, 3]} "' –

Trả lời

3

Hầu như không một câu trả lời, nhưng tôi chỉ thấy hai khả năng:

  1. tải đầy đủ JSON và đổ trở lại các giá trị mà bạn đã loại trừ khả năng trong câu hỏi của bạn
  2. Sửa đổi các nội dung bằng cách gói các giá trị trong dấu ngoặc kép, do đó sản lượng JSON tải chuỗi giá trị

Thành thật mà nói, tôi nghĩ rằng không có những điều như 'hiệu suất quan trọng JSON đang phân tích', nó chỉ có vẻ sai, vì vậy tôi muốn đi với opti đầu tiên trên.

1

tôi làm không phải bây giờ nếu nó thực sự những gì bạn cần, nhưng cố gắng

>>> 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"'} 

Đó là chút khó khăn, nguyên nhân bạn nạp để JSON đối tượng đầy đủ và hơn là chỉ đổ lại giá trị trong từ điển.

+1

"Không phân tích cú pháp toàn bộ chuỗi thành json và chuyển đổi tất cả các giá trị trở lại thành chuỗi". –

1

Tôi nghĩ rằng bạn có thể giải quyết này sử dụng regex, nó đang làm việc cho tôi:

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

Nhưng tôi không biết nếu điều này là nhanh hơn, bạn cần thử sử dụng dữ liệu của bạn.

[EDIT]

Có, nó nhanh hơn. Tôi đã thử các kịch bản dưới đây và phiên bản regex nhanh hơn gấp 5 lần.

sử dụng mô-đun 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()) 

sử dụng regex:

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)) 
Các vấn đề liên quan