Подтвердить что ты не робот

Массив объектов vs Объект объектов

Проблема заключается в том, чтобы решить компромисс между следующими обозначениями:

Основанный на JSON:

"users": {
    "id1": {
        "id": "id1",
        "firstname": "firstname1",
        "lastname": "lastname1"
    },
    "id2": {
        "id": "id2",
        "firstaame": "firstname2",
        "lastname": "lastname2"
    }
}

Массив:

users: [
    {
        "id": "id",
        "key2": "value2",
        "key3": "value3"
    },
    {
        "id": "id",
        "key2": "value2",
        "key3": "value3"
    }
]

Относительно этой публикации по той же проблеме, я решил (на переднем конце) использовать нотацию объекта JSON вместо массива объектов, поскольку он соответствует моим требованиям и более высокая производительность и меньше кода в браузере.

Но проблема в том, что сам список не является статичным. Под этим я подразумеваю, что список генерируется, то есть извлекается/сохраняется из БД (NoSQL) и создается для новых записей через API Java на сервере. Я не могу принять решение о том, какие обозначения следует использовать на задней панели (что в конечном итоге также повлияет и на пользовательский интерфейс).

Любые мысли/предложения о производительности, ремонтопригодности или масштабируемости оценены.

4b9b3361

Ответ 1

Это общий вопрос, основанный на мнениях. Может быть много других моментов, но я могу указать, как показано ниже.

Основанный на JSON подход: Если я не ошибаюсь, это будет реализовано с помощью Map на стороне сервера.

Преимущество: В JavaScript вы можете напрямую использовать users.id1, ​​users.id2, то есть нет необходимости в итерации

Недостаток: На стороне клиента некоторые из них потребуют идентификаторов, присутствующих в вашем JSON, то есть либо жесткого кодирования, либо с использованием какого-либо динамического подхода, который скажет вам, какой идентификатор присутствует в вашем JSON.


Массивный подход: Если я не ошибаюсь, это будет реализовано с помощью Array/List на стороне сервера.

Преимущество:

  • На стороне клиента вы можете напрямую перебирать массив, без заранее беспокоясь о том, какой идентификатор присутствует внутри него, т.е. трудно кодирование.
  • Как указано @JBNizet, подход на основе массива будет поддерживать порядок.

Недостаток: Если вы хотите получить один идентификатор, вам потребуется выполнить итерацию по массиву.

Как правило, мы не отправляем много информации на стороне клиента, поэтому подход на основе массива не создаст проблем. И преобразование массива в карту возможно как на стороне (сервере, так и на клиенте), если вам нужен подход на основе id.

Ответ 2

На стороне сервера массивы хранятся в виде простых списков: ArrayList<Content>, тогда как объекты либо хранятся в виде карт: HashMap<String, Content>, либо, в основном, как объекты Java.

Чтобы преобразовать объекты Java в JSON и из него, вы можете посмотреть проект Jackson, который сделает все, что для вас.

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

Глядя на ваш пример, я думаю, что Array - лучший подход, так как вы хотите вернуть список пользователей, которые все равны. Отправка идентификатора дважды не имеет смысла imho и увеличивает объем данных, которые необходимо передать.

Кроме того, поскольку Arrays гораздо проще хранить и выполнять итерацию на Java, они также должны обеспечивать лучшую производительность, чем объекты.

Некоторые общие отличия:

  • Массивы сохраняют порядок
  • Массивы могут содержать повторяющиеся записи
  • Объекты часто имеют более крупные издержки хранения/сети.
  • Массивы быстрее итерации (на стороне сервера)

Ответ 3

Один большой недостаток вашей первой нотации, основанной на "JSON", которая приходит на ум, заключается в том, что некоторые структуры будут иметь проблемы с (де) сериализацией этого. Например, DataContractSerializer (С#.NET) ожидает, что поля id1 и id2 будут определены (жестко запрограммированы) в классе ваших объектов users. Я не уверен, что это относится и к некоторым фреймворкам Java. Возможно, структура, которую вы будете использовать, может десериализовать ее как HashMap.

В целом я бы нашел, что нотация массива более интуитивно понятна для работы, когда дело касается итерации и т.д.

Ответ 4

Вы можете использовать object[property] нотацию для доступа или установки свойств объекта в JavaScript.

Перейдите с использованием подхода на основе массива на бэкэнд и преобразуйте массив в карту (на основе JSON, ссылаясь на нее) в интерфейсе.

var list = [{id: "id1", value: "One"}, {id: "id2", value: "Two"}]
var map = {};
list.forEach(function (item) { map[item.id] = item });
map.get("id1")

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

Таким образом, ваш сервер быстрее реагирует, так как ему не нужно преобразовывать список в карту. Ваш передний конец выполнит повторение O (n) один раз над списком, чтобы преобразовать его в карту. Но это небольшая цена по сравнению с O (n), которую вы будете платить каждый раз при поиске в списке.

Если вы будете делать по id, преимущественно на ваших данных на заднем конце, пойдите с JSON, основанным на самом сервере (вы можете использовать LinkedHashMap для сохранения порядка).

Ответ 5

Оба подхода имеют свои плюсы и минусы и зависят от того, на что вы смотрите.

Массивный подход легко сериализуется и более дружественен "каркасу" (вы можете добавить beans в список и сериализовать список, и все готово). Это позволяет, например, веб-контейнеру возвращать ответ, не требуя какой-либо настройки. Скорее всего, это будет поддерживаться по большинству фреймворков.

С другой стороны, основанный на объекте подход сложнее сгенерировать (в относительных терминах), но его легче искать, если известен ключ.

Итак, для простоты внедрения (по производителю), перейдите на основе массива. Для удобства использования (потребляемого клиентами) для объектно-ориентированного подхода.