gpt4 book ai didi

iphone - 使用嵌套对象检测缺失的 JSON 键

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:11 25 4
gpt4 key购买 nike

目前,我正在使用仍在开发中的 API。因此,响应中的键仍在变化。我已经成功地能够从 API 检索 JSON 数据并将其解析为 NSDictionary,然后使用此 NSDictionary 将值映射到自定义对象。我使用的方法如下

-(id)initWithDictionary:(NSDictionary*)dictionary
{
if(self = [super init]){
_ID = [dictionary valueForKey:kKEY_ID];
_name = [dictionary valueForKey:kKEY_NAME];
_nestedObject = [[NestedObject alloc]initWithDictionary:[dictionary valueForKey:kKEY_NESTED_OBJECT]];
//etc...
}
return self
}

每个嵌套对象也包含相同的解析结构。

除了 API 更改时,这工作正常。当确实发生变化时,所需的值不存在,这会导致意外行为或崩溃。

理想情况下,如果其中一个键发生变化,我想生成一个 NSError,我可以用它来打印发生变化的值,帮助我更快地找到变化并纠正它。

我觉得我目前能够想出的唯一替代方法是困惑且无法维护的。

-(id)initWithDictionary:(NSDictionary*)dictionary andError:(NSError**)error
{
if(self = [super init]){

BOOL _parsedSuccessfully = TRUE;

if (_parsedSuccessfully) {
_ID = [dictionary valueForKey: kKEY_ID];

if (!_ID){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_ID];
}
}

if (_parsedSuccessfully) {
_name = [dictionary valueForKey: kKEY_NAME];

if (!_name){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_NAME];
}
}

if (_parsedSuccessfully) {
_nestedObject = [[NestedObject alloc]initWithDictionary:[dictionary valueForKey:kKEY_NESTED_OBJECT]];

if (!_nestedObject){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_NESTED_OBJECT];
}
}

//etc...

if (!_parsedSuccessfully) {
return nil;
}
}
return self
}

我想知道是否还有其他更好的方法可以更好地减少重复。

如有任何帮助,我们将不胜感激。

最佳答案

为您的对象添加一个 isValid 方法,它可以在任何情况下使用,而不仅仅是从 JSON 字典初始化时。

- (BOOL)isValid:(NSError **)error {

#define CHECK_NOT_NULL(x, key) if (!x) { \
if (error != NULL) \
*error = [NSError parsingErrorFromKey:key]; \
return NO; \
}

#define CHECK_NOT_EMPTY(x, key) if (!x || ![x length]) { \
if (error != NULL) \
*error = [NSError parsingErrorFromKey:key]; \
return NO; \
}

CHECK_NOT_NULL(_ID, kKEY_ID);
CHECK_NOT_EMPTY(_name, kKEY_NAME);
// etc.

return YES;
#undef CHECK_NOT_NULL
#undef CHECK_NOT_EMPTY
}

然后在你的初始化方法中使用它:

- (id)initWithDictionary:(NSDictionary*)dictionary andError:(NSError**)error
{
if (self = [super init]) {
_ID = [dictionary valueForKey: kKEY_ID];
_name = [dictionary valueForKey: kKEY_NAME];
// etc.

if (![self isValid:error]) {
self = nil; // Assuming ARC
}
}
return self;
}

关于iphone - 使用嵌套对象检测缺失的 JSON 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18257653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com