Cocoa/CocoaTouchからRemember The Milk APIを使ってみる(その4:レスポンスの解析)
なんか順番メチャクチャじゃないですかこのシリーズ。
えーと、RTM APIのレスポンスはデフォルトではXML。
http://www.rememberthemilk.com/services/api/response.rest.rtm
呼び出しのときにパラメータにformat=jsonを含めるとJSONで返してくれるそうです。
http://www.rememberthemilk.com/services/api/response.json.rtm
NSXMLParserを引っ張り出して、このXMLをNSDictionaryに変換してやることにした。
要素名が複数形のsで終わったらNSArrayという乱暴な手段をとったコード。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { NSMutableDictionary *parentElement = [elementPath lastObject]; NSMutableDictionary *currentElement = [NSMutableDictionary dictionary]; // am i root? if (!parentElement) { self.response = currentElement; self.elementPath = [NSMutableArray array]; } [currentElement setObject:elementName forKey:@"_elementName"]; if (attributeDict) [currentElement setObject:attributeDict forKey:@"_attribute"]; // have i an array? if ([elementName hasSuffix:@"s"]) { [currentElement setObject:[NSMutableArray array] forKey:@"_array"]; } // am i in array? NSMutableArray *currentArray = [parentElement objectForKey:@"_array"]; if (currentArray) { [currentArray addObject:currentElement]; } else { [parentElement setObject:currentElement forKey:elementName]; } [elementPath addObject:currentElement]; } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSMutableDictionary *currentElement = [elementPath lastObject]; NSMutableString *currentContent = [currentElement objectForKey:@"_content"]; if (!currentContent) { currentContent = [NSMutableString string]; [currentElement setObject:currentContent forKey:@"_content"]; } [currentContent appendString:string]; } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { [elementPath removeLastObject]; }
で、APIを叩く→レスポンスをNSDictionaryで返す、をやってくれるクラスを作った。未来の俺はもっとマシなコードを書くように。
http://homepage.mac.com/k_natori/Temp/RTMConnector.zip