Python Tuple в Java XMLRPC
Я пытаюсь передать python кортеж через java xmlrpc. Вот библиотека, которую я использую:
XMLPRC Java Libray
Я использую оболочку odoo на сервере и api. Я хочу передать аргумент, который будет выглядеть следующим образом:
[(4,7), (4,8)]
Я могу передать следующую структуру:
[[4,7], [4,8]]
который явно имеет массив внутри массива, например:
new Object[]{new Object[]{4,7},new Object[]{4,8}}
Проблема в том, что в java нет кортежа. Я понимаю, как преобразовать эту структуру:
Это [4,8] к этому (4,8)
Это какая-то проблема с сериализацией, которая не знает, как ее решить и передать ожидаемую структуру python.
Ответы
Ответ 1
Есть ли проблема с [[4,7],[4,8]]
? Большинство операций на python не отличаются от кортежей из реальных списков. И в Оду еще меньше. Я думаю, что это правильный способ отправить список кортежей через языки, которые не реализуют кортежи. Кортеж не является ключевым, ценным. У вас может быть (a, b, c)
, который является кортежем. Это несколько похоже на [a, b, c]
. Вы можете повторять и то и другое. Вы можете получить их значение через индексы (если оба они были сохранены в переменной element
, получение a
из этого будет element[0]
для них обоих).
Итак, если у вас есть проблема, я не думаю о кортежах, и вы не ответили на комментарий, спрашивая, есть ли ошибка при вызове XMLRPC. Я предполагаю, что ошибок нет. И если есть ошибка, я уверен, что это не о кортежах.
Ответ 2
Простая идея - отправить его как строку. Так же, как в java:
String a="[[4,7],[4,8]]";
В python вы можете просто использовать метод eval(), чтобы получить его как массив массивов. Если вы хотите, чтобы это был массив кортежей, используйте:
String a="[(4,7),(4,8)]";
Просто используйте синтаксис python как строку. В python вы можете использовать:
my_list=eval(a)
print my_list[0]
Это даст:
(4,7)
в качестве вывода для последнего примера.
Ответ 3
XML-RPC ограничен. Таким образом, для списка и кортежа существует только один тип. Если вы посмотрите на docs для odoo, вы увидите, что оба кортежа и списки в примерах Python преобразуются в Arrays.asList на Java. Итак, если вы получаете некоторые ошибки, есть хорошая вероятность, что что-то еще не так.
Ответ 4
Попробовали ли вы использовать класс Apair commons Pair? Docs.
Просто сделал быстрый тест, и это похоже на то, что вы хотите.
System.out.println(new ImmutablePair<>(1,3).toString());
(1,3)
Сериализатор по умолчанию должен выводить пар [] в формате [(1,2),...], который вы ожидаете.
Ответ 5
После долгого поиска я получил решение. Поэтому я решил ответить на это четко. Мой ответ, скорее всего, будет окутан. До сих пор я не нашел способ сериализации этой структуры. Но рамка odo приняла кортеж следующим образом:
[ [ 4, [7,8] ]
или
Arrays.asList(Arrays.asList(4, Arrays.asList(7,8)));
это эквивалентно:
[(4,3),(4,7)]
Надеюсь, это поможет кому-то.