我正在处理大量的json,并且只需要NSArray内部的NSString表示 - 包括所有{}
我的问题是 - 他们比在主NSArray中循环遍历每个NSArray并逐个输出描述更好吗?
即 - 下面是这个过程的开始,但它非常脆弱,这意味着我需要知道帽子里面的每个项目{},这不是我真正关心的事情。我只需要json字符串向前移动。
下面的工作代码(提前谢谢!)
NSString* responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
NSArray* json = [responseString JSONValue];
NSArray* item = [json valueForKeyPath:@"d.data"];
NSArray* hatjson = [item objectForKey:@"hat"];
NSMutableString * result = [[NSMutableString alloc] init];
for (NSObject * obj in hatjson)
{
[result appendString:[obj description]];
}
NSLog(@"the hat json is .. %@", result);
答案 0 :(得分:1)
// …
NSArray* hatjson = [item objectForKey:@"hat"];
NSString *result = [hatjson JSONRepresentation];
NSLog(@"the hat json is .. %@", result);
我假设你正在使用SBJSON进行JSON解析。 SBJSON在NSObject
上定义了一个包含方法
- (NSString *)JSONRepresentation;
此方法返回一个包含给定对象的JSON表示形式的字符串,只要该对象是SBJSON可以转换为JSON的类的实例(例如字符串,数字,数组,字典)。
答案 1 :(得分:1)
我假设你在这里使用JSON库:https://github.com/stig/json-framework
你抱怨你提供的代码是脆弱的,但听起来,对于你想要的,情况是脆弱的,所以我认为只要你放入访问它的代码就很脆弱了NSAsserts在那里,以便您在假设被打破时尽快知道。
我认为你所展示的代码中最脆弱的一点就是它假设你正在回溯NSArrays,当它从你访问它的方式看来它实际上是在给你NSDictionaries。
例如,读取代码,我得出结论,responseString表示一个JSON嵌套映射,如下所示:
{ "d": { "data": { "hat": "baseball cap" } } }
接下来的问题是“您是否曾期望与”帽子“键相对应的值具有多个值?”我会像这样对这段代码进行泛化:
NSString* responseString = [[[NSString alloc] initWithData: responseData encoding: NSUTF8StringEncoding] autorelease];
[responseData release];
id json = [responseString JSONValue];
id hatJSONValue = [json valueForKeyPath:@"d.data.hat"];
NSString* result = nil;
if ([hatJSONValue isKindOfClass: [NSArray class]] && [hatJSONValue count] == 1)
{
result = [[hatJSONValue lastObject] description];
}
else
{
NSAssert(NO, @"Assumptions about returned JSON were wrong.");
}
NSLog(@"the hat json is .. %@", result);
一般来说,你总是需要在编写非脆弱的代码和完成任务之间进行权衡。关键应该是,如果你的代码要做出假设,你应该断言它们是真的,所以如果情况发生变化,你就会知道!