Skip to content

Поддержка многомерных массивов #124

@MadSchemas

Description

@MadSchemas

В rx 5.9.0 появилась поддержка многомерных массивов в CJSON.

Сейчас коннектор уже умеет паковать вложенные массивы, но только если они завёрнуты в объекты: {"abc": [ {"f": [1,2,3]}, {"f": "str"}, {"f": [2,3]} ]}.

Вот так выглядит упаковка одномерного массива (она в java-коннекторе уже есть):

ctag (array) // Здесь указано, что дальше лежит массив
atag (int, len) // Здесь тип элементов в массиве и их количество
<int>
<int>

Для многомерных массивов логика упаковки аналогичная (это нужно поддержать). Допустим, мы кодируем вот такой массив {"abc":[[1,2,3], "str", [2,3]]}:

ctag (array) // Здесь указано, что дальше лежит массив
atag (object, len) // Здесь object указывает, что массив гетерогенный
ctag (array) // Здесь указано, что первый объект в составе массива это другой массив
atag (int, len) // тип и длина вложенного массива
<int>
<int>
<int>
ctag (string) // Второй элемент основного массива с типом string
<string>
ctag (array)
atag (int, len) // Третий элемент основного массива, тоже вложенный массив
<int>
<int>

Ещё немного примеров кодирования можно посмотреть в доке https://reindexer.io/reindexer-docs/internal_strucrure/cjson/

Реализация на Go вот здесь https://github.com/Restream/reindexer/tree/master/cjson

Конвертацию из cjson в java-объекты и обратно нужно поддержать для следующих кейсов:

  1. [[1,2],[3],[4,5]] - обычный n-мерный массив конвертируется в n-мерный ArrayList (например);
  2. [[1,2],3,[4,5]] - в таком виде некоторые элементы не являются массивами, но тоже однозначно отображаются в n-мерный ArrayList (3 станет массивом из 1 элемента);
  3. [[1,[2,3]],3,[4,5]]/[[1,2], "string", 4] - различные гетерогенные варианты. В Go такое отображается в массив interface{}. В Java, вероятно, нам и вовся такие штуки поддерживать не стоит (на усмотрение разработчика).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions