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)]

Надеюсь, это поможет кому-то.