我们目前正在为我们的iOS应用评估JSONModel,并且到目前为止都非常喜欢它。问题是,我们必须处理一个OData应用程序接口,它往往会在几个地方使事情变得过于复杂。例如,当返回一个实体列表时,我能想到的所有API都会返回如下所示的简单内容:
{
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“是我最小的问题(因为我们可以把它解析掉)。但是我不知道如何处理这样一个事实,即列表中的每一项都被包装在一个以该项的类型为键的散列中,因此通过NSArray的JSONModel关系不起作用。我可以像这样为我的项目定义JSONKeyMapper:
@"Item.id" : @"id",
@"Item.name" : @"name"但是,当有多个项时,OData标准只将项包装在它们自己的散列结构中。例如,当仅从OData应用程序接口获取单个项时,我得到(正如预期的):
{
d: {
results: {
id => 123,
name => 'foo'
}
}
}:-(
对如何处理这个问题有什么想法吗?在任何人建议两个主要的OData iOS客户端之一之前:不幸的是,这两个客户端似乎都相当不受支持和/或过时,包括微软列出的官方客户端。
发布于 2013-08-09 01:26:04
一个FYI可能会回答你的问题:
您发布的JSON是OData的旧JSON格式(现在通常称为"JSON Verbose")。事实上,当OData被OASIS正式标准化时,它将完全消失。
我们替换这种旧格式的部分原因正是您在这里遇到的:它很难使用。
如果您正在与之交谈的应用程序服务支持OData协议的版本3,那么请求“OData / JSON”应该返回新的JSON格式。您可以更明确地要求"application/json;odata=minimalmetadata“。新的JSON格式没有任何"d“包装器,其结构类似于问题开头所期望的JSON。
如果您正在与之交谈的服务不支持V3,并且您无法自己控制该服务,那么我将把它留给其他人来帮助解决您需要解决的Objective-C问题。如果您确实控制了服务(或者可以纠缠这样做的人),我建议您更新服务以支持V3。
发布于 2013-09-20 03:13:58
在理解OAuth为什么要做你所描述的事情时,我不会涉及太多细节,以下是我将如何处理这一问题。
无论如何,我的观点是,您不需要在一次操作中解析所有内容。您也可以在首次访问自定义访问器方法中的属性时执行此操作。或者,如果你真的想做一些时髦的设置,你也可以实现一个自定义的initWithDictionary:error: method,并在实例初始化的最后添加一些额外的逻辑。
https://stackoverflow.com/questions/18129203
复制相似问题