Массив объектов 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 вместо массива объектов, поскольку это соответствует моим требованиям и лучшей производительности и меньшему коду в браузере.
но проблема в том, что сам список не статический. Под этим я подразумеваю, что список генерируется, т. е. извлекается/сохраняется из DB (NoSQL) и создается для новых записей через Java API на сервере. Я не могу решить, какую нотацию я должен использовать в конце (что в конечном итоге также повлияет на пользовательский интерфейс).
любые мысли/предложения о производительности, ремонтопригодности или масштабируемости ценятся.
5 ответов
это общий вопрос, основанный на мнении. Там может быть много других моментов, но я могу указать, как показано ниже.
подход на основе JSON:
Если я не ошибаюсь, это будет реализовано с помощью Map
на стороне сервера.
преимущество : в JavaScript вы можете напрямую использовать пользователей.id1, пользователи.id2 т. е. нет необходимости в итерации
недостаток : на стороне клиента, некоторые, как вам потребуются идентификаторы, присутствующие в вашем JSON, т. е. либо жесткое кодирование, либо использование динамического подхода, который скажет вам, какой id присутствует в вашем JSON.
подход на основе массива: если я не ошибаюсь, то это будет реализовано с помощью Array
/List
на стороне сервера.
преимущество:
- на стороне клиента, вы можете сразу итерировать через массив, без беспокоясь заранее о том, какой id присутствует внутри него, т. е. не трудно кодирование.
- As указал @JBNizet, подход на основе массива будет поддерживать порядок.
недостаток : если вы хотите получить один идентификатор, вам нужно будет перебрать массив.
вообще мы не отправляем много информации на стороне клиента, поэтому подход на основе массива не создаст никаких проблем. И преобразование массива в карту возможно как на стороне (сервер и клиент) если вы хотите подход на основе id.
на стороне сервера, массивы хранятся в виде простых списков: ArrayList<Content>
, в то время как объекты хранятся в виде карт: HashMap<String, Content>
или, в основном, как объекты Java.
чтобы преобразовать объекты Java в JSON и из JSON, вы можете взглянуть на Джексон что делает все это для вас.
Я бы не беспокоился о каких-либо различиях в производительности между этими двумя вариантами. Более важно иметь понятный семантический API, поэтому вы должны основывать свой желание по бизнес-кейсу, а не производительность.
глядя на ваш пример, я думаю Array
является лучшим подходом, так как вы хотите вернуть список пользователей, которые все равны. Отправка id дважды не имеет смысла imho и увеличивает объем данных, которые должны быть переданы.
кроме того, так как Arrays
намного проще хранить и перебирать в Java, они также должны обеспечивать лучшую производительность, чем объекты.
некоторые общие различия:
- массивы сохраняют порядок
- массивы могут содержать повторяющиеся записи
- объекты часто имеют большие накладные расходы на хранение / сеть
- массивы быстрее итерации (на стороне сервера)
одним из больших недостатков вашей первой нотации на основе JSON, которая приходит на ум, является то, что некоторые фреймворки будут иметь проблемы с (de)сериализацией этого. Например, DataContractSerializer (C# .NET) будет ожидать поля id1
и id2
для определения (hardcoded) в классе ваших объектов users
. Я не уверен, что это относится и к некоторым Java-фреймворкам. Может быть, эти рамки вы можете использовать deserialze его как хранилище HashMap вместо.
В целом я бы нашел массив нотация гораздо более интуитивно понятна для работы, когда дело доходит до итерации и т. д.
можно использовать 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
для сохранения заказа).
оба подхода имеют свои плюсы и минусы и зависит от того, что вы смотрите.
подход массива прост в сериализации и более удобен для "фреймворка" (вы можете добавить бобы в список и сериализовать список, и все готово). Это позволяет, например, веб-контейнеру возвращать ответ, не требуя настройки. Это, вероятно, будет поддерживаться из коробки большинством фреймворков.
с другой стороны, объектно-ориентированный подход сложнее генерировать (в относительных терминах), но его легче искать, учитывая, что ключ известен.
поэтому для простоты реализации (производителем) перейдите к подходу на основе массива. Для удобства использования (потребляется клиентами) перейти на объектный подход.