在iPhone上的Objective-C中从Rails解析JSON集合

rph*_*ath 2 iphone json ruby-on-rails objective-c ios

我正在使用TouchJSON来解析JSON Rails API的输出,但是遇到了困难.总体目标是遍历响应,解析JSON,Round为每个JSON对象创建一个实例,并将这些Round对象粘贴到NSArray中,以便我可以将其加载到UITableView.因此,如果有一种比我即将展示的更直接的方式(目前不工作,顺便说一下),请告诉我.

Rails API返回一个类似于以下内容的集合:

[
  { 
    "round": { "course_title": "Title A", "result": "+8" }
  },
  { 
    "round": { "course_title": "Title B", "result": "+4" }
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)

我也在使用ASIHTTPRequest,我可以使用以下方法成功获得响应:

NSString *responseString = [request responseString];
Run Code Online (Sandbox Code Playgroud)

但从那里,我似乎无法到达任何地方.这里或多或少是TouchJSON的建议:

NSString *jsonString = [request responseString]; // [{"round":{...}}, ..., {"round:{...}}]
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
NSDictionary *dictionary = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:nil];

// then I do this...
NSLog(@"JSON: %@", dictionary); // JSON: null
Run Code Online (Sandbox Code Playgroud)

我想从那里我可以循环遍历字典并使用我的Round类创建对象映射.但也许这完全是错误的做法.

我的想法是从Rails返回的JSON是一个JSON对象数组,所以也许这就是为什么JSON解析器不能将它识别为有效的JSON?由此,我有两个问题:

1)TouchJSON是否能够接受我的API返回的JSON对象数组?

2)是否可以将responseString强制转换为NSArray,以便循环遍历每个"round"并以这种方式解析JSON?如果我从响应字符串中删除第一个和最后一个字符(即"["和"]"),JSON解析器将只捕获集合中的第一个"圆".

3)我是否正确地处理了整个过程?

任何提示/建议将不胜感激.

sch*_*hwa 21

TouchJSON提供了从JSON到Obj-C对象的三种主要方式.它们都存在于您已经使用的CJSONDeserializer的标题中:

- (id)deserialize:(NSData *)inData error:(NSError **)outError;

- (id)deserializeAsDictionary:(NSData *)inData error:(NSError **)outError;
- (id)deserializeAsArray:(NSData *)inData error:(NSError **)outError;
Run Code Online (Sandbox Code Playgroud)

第一个将返回return,无论是字典,数组,字符串还是JSON的根类型.

另外两个期望一个字典或一个数组,如果他们没有得到正确的数据,他们会抱怨(即返回nil并给你一个NSError).


Jam*_*ers 5

该deserializeAsDictionary:error:方法CJSONDeserializer依赖于scanJSONDictionary:error:的方法CJSONScanner.该方法期望"字典"是对象文字.因此,您的数据必须以a开头{.由于您的数据是一个数组,您可能希望使用该deserializeAsArray:error:方法CJSONDeserializer.