Лучший способ кодирования кортежей с помощью json

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

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

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

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

Ответ 1

Возможно, вы захотите сказать

{"[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]]

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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