2013-08-08 3 views
3

В настоящее время мы оцениваем JSONModel для нашего приложения iOS и им очень нравится. Дело в том, что нам нужно иметь дело с API OData, который имеет тенденцию к избыточному усложнению вещей в нескольких местах. Например, при получении обратно список лиц, все интерфейсы API, я могу думать о возвращенной что-то простое, как это:JSONModel и OData

{ 
    items: [ 
    { id => 123, name => 'foo' }, 
    { id => 124, name => 'bar' }, 
    { id => 125, name => 'baz' }, 
    ] 
} 

К сожалению, OData дает мне что-то еще вроде этого:

{ 
    d: { 
    results: [ 
     { Item => { id => 123, name => 'foo' } }, 
     { Item => { id => 124, name => 'bar' } }, 
     { Item => { id => 125, name => 'baz' } }, 
    ] 
    } 
} 

«D «будучи моей наименьшей проблемой (поскольку мы можем просто разобрать ее). Но я не могу понять, как справиться с тем, что каждый элемент в списке обернут хешем с типом элемента в качестве ключа, так что отношения JSONModel через NSArray не работают. Я мог бы определить JSONKeyMapper для моего пункта, как это:

@"Item.id" : @"id", 
@"Item.name" : @"name" 

но стандарт OData обертывания только элементы в их собственной хэш-структуре, когда Есть несколько элементов. Например, при выборке только один элемент из API OData, я (как и ожидалось):

{ 
    d: { 
    results: { 
     id => 123, 
     name => 'foo' 
    } 
    } 
} 

:-(

Любые идеи о том, как бороться с этим и, прежде чем кто-либо говорит один из? две основные клиенты OData IOS там: к сожалению, они оба кажутся довольно неподдерживаемыми и/или устарели, в том числе официального перечисленной корпорацией Майкрософт

ответ

1

FYI, которые могли бы оказаться, чтобы ответить на ваш вопрос:.

Выставляемый JSON - это старый формат JSON OData (теперь обычно называемый «JSON Verbose»). Фактически, он уходит полностью, когда OData формально стандартизируется OASIS.

Часть причины, по которой мы заменили этот старый формат, - это именно то, с чем вы сталкиваетесь здесь: это трудно потреблять.

Если служба OData, с которой вы разговариваете, поддерживает версию 3 протокола OData, запрос «application/json» должен вернуть новый формат JSON. Вы можете более подробно рассказать об этом для запроса «application/json; odata = minimalmetadata». Новый формат JSON не имеет оболочки «d» и структурирован как JSON, который вы ожидали в верхней части вашего вопроса.

Если служба, с которой вы разговариваете, не поддерживает V3, и вы не контролируете ее сами, я оставлю ее кому-то еще, чтобы помочь с Objective-C, вам нужно обойти это. Если вы контролируете услугу (или можете наносить вред тому, кто это делает), я рекомендую обновить службу для поддержки V3.

+0

Спасибо за понимание, Джен! –

+0

К сожалению, AFAICT OData v3 по-прежнему переносит расширенные свойства в свою собственную структуру хэша, что действительно затрудняет использование стандартных библиотек ORM, таких как JSONModel или даже RestKit. Слишком плохо, что существуют рабочие ссылки OData для почти всех основных языков, и официальная клиентская библиотека iOS даже не компилируется с недавними версиями iOS, когда я последний раз проверял. –

+0

Я думаю, вы ошибаетесь. OData v3 делает * not * wrap расширенные свойства в свою собственную структуру хеширования. Я просто запустил учебник ниже, и он работает как шарм. Хороший чистый JSON. http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint –

0

Не вдаваясь в подробности, понимая, почему OAuth делает то, что вы описали, вот как я подхожу к этому.

  1. Сделать «результаты» необязательным.
  2. Добавить акцесор (скажем) «resultsBetter» моделировать новое только для чтения свойства на вашей модели класса
  3. Сделать - (ID) resultsBetter метода проверкой типа «результаты» значения в первом вы получаете доступ к методу и возвращают либо экземпляр JSONModel, соответствующий 1 результату, либо массив с более чем экземплярами JSONModel (или если вам нужен только первый в массиве , вы можете вернуть также только 1 объект) ...

В любом случае s, я хочу сказать, что вам не нужно разбирать все одним выстрелом. Вы также можете сделать это при первом доступе к свойству в пользовательском методе доступа. Или, если вы действительно хотите настроить фанки, вы также можете реализовать собственный метод initWithDictionary: error: и добавить дополнительную логику в конце инициализации экземпляра.

+0

Спасибо! К счастью, мы полностью избавились от раздувания OData и теперь стремимся к использованию API, который легче потреблять, что делает мою проблему устаревшей. ;-) –