Лучший способ кодировать кортежи с помощью JSON - PullRequest
37 голосов
/ 04 апреля 2009

В Python у меня есть словарь, который отображает кортежи в список кортежей. например

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

Я хочу иметь возможность кодировать эти данные, используя их с javascript, поэтому я посмотрел на json, но кажется, что ключи должны быть строками, поэтому мой кортеж не работает как ключ.

Является ли лучший способ справиться с этим, закодировать его как "1,2", а затем проанализировать его в то, что я хочу в JavaScript? Или есть более умный способ справиться с этим.

Ответы [ 5 ]

22 голосов
/ 04 апреля 2009

Вы могли бы подумать сказать

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

и затем, когда вам нужно получить значение, вы можете просто проанализировать сами ключи как объекты JSON, что все современные браузеры могут делать со встроенным методом JSON.parse (я использую jQuery.each для итерации здесь, но вы можете использовать все, что угодно):

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
});

С другой стороны, вы можете захотеть просто структурировать свой объект по-другому, например

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

так, чтобы вместо

сказать
myjson[1,2] // doesn't work

неверный синтаксис Javascript, можно сказать

myjson[1][2] // returns [[2,3],[1,7]]
7 голосов
/ 04 апреля 2009

Если ваши кортежи ключей являются действительно целочисленными парами, то самый простой и, вероятно, самый простой подход будет, как вы предлагаете ... кодировать их в строку. Вы можете сделать это в одну строку:

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

Это даст вам структуру данных javascript, ключи которой вы можете затем разделить, чтобы вернуть очки снова:

'1,2'.split(',')
2 голосов
/ 04 апреля 2009

Моя рекомендация будет:

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

Он все еще анализируется, но в зависимости от того, как вы его используете, в этой форме может быть проще.

1 голос
/ 04 апреля 2009

Вы не можете использовать массив в качестве ключа в JSON. Лучшее, что вы можете сделать, это закодировать его. Извините, но на самом деле другого разумного способа сделать это нет.

0 голосов
/ 04 апреля 2009

Может ли это быть просто двумерный массив? Тогда вы можете использовать целые числа в качестве ключей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...