如何从json对象中提取实际的NSString作为NSArray

时间:2010-12-31 14:52:21

标签: iphone objective-c json

我正在处理大量的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);

2 个答案:

答案 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);

一般来说,你总是需要在编写非脆弱的代码和完成任务之间进行权衡。关键应该是,如果你的代码要做出假设,你应该断言它们是真的,所以如果情况发生变化,你就会知道!