2009-04-03 2 views
31

Trong python tôi có một từ điển ánh xạ các bộ dữ liệu vào một danh sách các bộ dữ liệu. ví dụ.Cách tốt nhất để mã hóa các bộ dữ liệu bằng json

{(1,2): [(2,3),(1,7)]}

Tôi muốn để có thể mã hóa dữ liệu này sử dụng nó với javascript, vì vậy tôi nhìn vào json nhưng nó xuất hiện phím phải chuỗi để tuple của tôi không làm việc như một chìa khóa.

Cách tốt nhất để xử lý điều này là mã hóa nó thành "1,2" và sau đó phân tích cú pháp nó thành thứ tôi muốn trên javascript? Hoặc là có một cách thông minh hơn để xử lý việc này.

Trả lời

19

Bạn có thể xem xét nói

{"[1,2]": [(2,3),(1,7)]} 

và sau đó khi bạn cần để có được giá trị ra, bạn chỉ có thể phân tích các phím tự như các đối tượng JSON, mà tất cả các trình duyệt hiện đại có thể làm với các built-in JSON.parse phương pháp (tôi đang sử dụng jQuery.each để lặp ở đây nhưng bạn có thể sử dụng bất cứ điều gì):

var myjson = JSON.parse('{"[1,2]": [[2,3],[1,7]]}'); 
$.each(myjson, function(keystr,val){ 
    var key = JSON.parse(keystr); 
    // do something with key and val 
}); 

Mặt khác, bạn có thể muốn chỉ cấu trúc đối tượng của bạn khác nhau, ví dụ:

{1: {2: [(2,3),(1,7)]}} 

để thay vì nói

myjson[1,2] // doesn't work 

đó là cú pháp Javascript không hợp lệ, bạn có thể nói

myjson[1][2] // returns [[2,3],[1,7]] 
+1

Cảm ơn ý tưởng về từ điển lồng nhau! Tôi sẽ không nghĩ về điều đó. Không chắc chắn cách tiếp cận nào sẽ hoạt động tốt hơn cho tôi nhưng có vẻ như là một ý tưởng gọn gàng, cảm ơn! – f4hy

0

Có thể đơn giản là mảng hai chiều không? Sau đó, bạn có thể sử dụng số nguyên như phím

+0

hai mảng chiều là vụng về trong python, nếu không thì nó có thể hoạt động. – f4hy

2

Khuyến cáo của tôi sẽ là:

{ "1": [ 
     { "2": [[2,3],[1,7]] } 
     ] 
} 

Nó vẫn phân tích cú pháp, nhưng tùy thuộc vào cách bạn sử dụng nó, nó có thể được dễ dàng hơn theo hình thức này.

1

Bạn không thể sử dụng mảng làm khóa trong JSON. Điều tốt nhất bạn có thể làm là mã hóa nó. Xin lỗi, nhưng thực sự không có cách nào khác để làm điều đó.

7

Nếu các bộ chìa khóa của bạn đang thực sự cặp số nguyên, thì dễ nhất và có lẽ hầu hết cách tiếp cận đơn giản sẽ như bạn đề xuất .... mã hóa chúng thành một chuỗi. Bạn có thể làm điều này trong một lớp lót:

>>> simplejson.dumps(dict([("%d,%d" % k, v) for k, v in d.items()])) 
'{"1,2": [[2, 3], [1, 7]]}' 

Điều này sẽ giúp bạn có được một cấu trúc dữ liệu javascript có phím thì bạn có thể chia để có được điểm lại một lần nữa:

'1,2'.split(',') 
+0

Cảm ơn bạn đã chỉnh sửa nosklo ... mọi người cần có trình chỉnh sửa tốt :-) –

+0

Tuyệt. Cảm ơn các mẫu mã quá! – f4hy

+0

Ví dụ cụ thể này, tuple ('1,2'.split (', ')). Và nếu ví dụ của câu hỏi là The Norm, người ta muốn tuple (int (s) cho s trong '1,2'.split (', '))). – pythonlarry