2012-09-09 34 views
10

Tôi đang viết một chương trình nhỏ trong python và tôi đang sử dụng từ điển có (như tiêu đề cho biết) khóa và giá trị là bộ dữ liệu. Tôi đang cố gắng sử dụng json như sauLưu từ điển có khóa là tuples với json, python

import json 
data = {(1,2,3):(a,b,c),(2,6,3):(6,3,2)} 
print json.dumps(data) 

Vấn đề là tôi tiếp tục nhận được TypeError: keys must be a string.

Làm cách nào để tôi thực hiện? Tôi đã thử nhìn vào tài liệu python nhưng không thấy bất kỳ giải pháp rõ ràng. Cảm ơn!

+5

Nhưng định dạng JSON yêu cầu các khóa là chuỗi ... – kennytm

+0

Tôi có thể phân tích cú pháp dưới dạng Chuỗi không? – Yotam

+0

Tại sao bạn cần tuple làm khóa? – seriousdev

Trả lời

12

Bạn sẽ cần phải chuyển đổi các bộ của bạn thành các chuỗi đầu tiên:

json.dumps({str(k): v for k, v in data.iteritems()}) 

Tất nhiên, bạn sẽ kết thúc với chuỗi thay vì tuples cho các phím:

'{"(1, 2, 3)": ["a", "b", "c"], "(2, 6, 3)": [6, 3, 2]}' 
+0

Thật thú vị khi biết cách đảo ngược hành động này. –

+3

@RickyRobinson: 'ast.literal_eval()' sẽ tạo lại giá trị Python từ chuỗi. –

+1

Điều này làm việc cho tôi trong python3: conversion = {ast.literal_eval (k): v cho k, v trong json.items()} – Johan

5

Nếu bạn muốn tải dữ liệu của bạn sau này, bạn phải postprocess nó anyway. Vì vậy, tôi muốn chỉ đổ data.items():

>>> import json 
>>> a, b, c = "abc" 
>>> data = {(1,2,3):(a,b,c), (2,6,3):(6,3,2)} 
>>> on_disk = json.dumps(data.items()) 
>>> on_disk 
'[[[2, 6, 3], [6, 3, 2]], [[1, 2, 3], ["a", "b", "c"]]]' 
>>> data_restored = dict(map(tuple, kv) for kv in json.loads(on_disk)) 
>>> data_restored 
{(2, 6, 3): (6, 3, 2), (1, 2, 3): (u'a', u'b', u'c')} 
0

Đối với Python 3 * người sử dụng: ngoài @Martijn Pieters câu trả lời,

dictonary.iteritems() là không hợp lệ, thay thế nó với dictionary.items():

json.dumps({str(k): v for k, v in data.items()}) 
0

Bạn có thể sử dụng mô-đun ujson. ujson.dumps() chấp nhận tuples là các khóa trong từ điển. Bạn có thể cài đặt ujson bằng pip.

Các vấn đề liên quan