2012-01-20 2 views
3

У меня есть служба REST, которая возвращает список объектов. Каждый объект содержит objectcode и objectname.Как отформатировать ответ JSON?

Это мой первый раз, когда вы строите службу REST, поэтому я не уверен, как отформатировать ответ.

Должна ли она быть:

{ 
    "objects": { 
     "count": 2, 
     "object": [ 
      { 
       "objectcode": "1", 
       "objectname": "foo" 
      }, 
      { 
       "objectcode": "2", 
       "objectname": "bar" 
      }, 
      ...more objects 
     ] 
    } 
} 

ИЛИ

[ 
    { 
     "objectcode": "1", 
     "objectname": "foo" 
    }, 
    { 
     "objectcode": "2", 
     "objectname": "bar" 
    }, 
    ...more objects 
] 

Я понимаю, что это может быть немного субъективны, но будет легче потреблять? Мне также нужно будет поддерживать отформатированный ответ XML позже.

+0

BTW, теперь я создаю приложение, и веб-служба возвращает ответ наподобие второго (массив в корне). Проблема в том, что я не могу справиться с этой ситуацией с помощью RestKit. Есть ли какие-то ограничения, которых я не знаю? как вы создаете дескрипторы ответов, когда ответ представляет собой массив? Заранее спасибо. – Ricardo

ответ

3

Они одинаковы для потребления, поскольку библиотека обрабатывает и то, и другое отлично. Первая имеет преимущество перед вторым: вы сможете расширить ответ, чтобы включить другую информацию, дополнительную для объектов (например, категории), не нарушая существующий код.

Что-то вроде

{ 
    "objects": { 
     "count": 2, 
     "object": [ 
      { 
       "objectcode": "1", 
       "objectname": "foo" 
      }, 
      { 
       "objectcode": "2", 
       "objectname": "bar" 
      }, 
      ...more objects 
     ] 
    } 

"categories": { 
    "count": 2, 
    "category" : [ 
    { "name": "some category"} 
    ] 
    } 
} 

Кроме того, не следует JSON быть отформатирован в любом случае, так что удалить пробелы, разрывы строк и т.д. Кроме того, количество не является необходимым, так как он будет сохранен в то время как синтаксический сами объекты.

+1

Вы делаете некоторые хорошие моменты, о которых я не думал. Его определенно здорово, чтобы ответ расширялся без нарушения существующего кода, и подсчет кажется излишним, если ответ все равно должен быть проанализирован. – xbonez

+0

Так Facebook возвращает все свои запросы JSON, поэтому я бы счел это плюсом для этого формата. Это дает вам большую гибкость при сохранении последовательности ваших ответов. – blachniet

+0

Да, у меня был такой же опыт (поддержка нескольких версий приложений для iPhone с различными ответами). Если бы я следовал второму подходу, я бы сломал предыдущие версии. – Femaref

-1

Как клиент, я бы предпочел второй формат. Если первый формат включает только количество «объектов», это избыточная информация.

2

Я часто вижу первый. Иногда проще манипулировать данными для метаданных. Например, Google API использует первый вариант: http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true

+0

В ответе google есть поле '' Status ': «Ok» '. Не должно ли это передаваться через заголовок? – xbonez

+0

Поле «status» указывает, возвращает ли сервер данные. Это должно отличать «статус ошибки» от URL-адреса или параметров и «статус данных». Если это было передано в заголовке, разработчик может изменить ситуацию. – JuSchz

+0

Хороший ответ для упоминания использования метаданных. А также за то, что он предоставил реальный пример. Что касается вопроса @xbonez о «статусе», то это (спорная?) Философия от JSend http://labs.omniti.com/labs/jsend – RayLuo

1

Речь идет не только о личных предпочтениях; это также вопрос ваших требований. Например, если бы я был в той же ситуации, и мне нужно было подсчитать количество объектов на стороне клиента, тогда я бы пошел с первым подходом, иначе я выберу второй.

Также обратите внимание, что «классический» сервер REST в основном будет работать по-другому. Если какая-то функция REST возвращает список объектов, тогда она должна вернуть только те объекты , которые были указаны в этих объектах. URL-адреса должны указывать на конечные точки деталей - поэтому, запрашивая каждую конечную точку, вы можете получить подробную информацию о конкретном отдельном объекте.

Смежные вопросы