从http响应中的NSMutableData中提取数组

时间:2010-08-03 22:24:36

标签: iphone

使用iphone sdk 4.0。 http请求的回调将数据作为NSData对象

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Append the data received to our data
    [theData appendData:data];
}

在我服务器上的php脚本中,我返回一个数组,如下所示

var_dump($array).

如何从我的iphone上的NSMutableData对象'theData'上取回我的数组。

由于

3 个答案:

答案 0 :(得分:3)

你有一个字符串描述你的数组(或者几个数组?)存储为NSMutableData对象中的字节序列。为了将它变回一个数组,你需要解析var_dump输出,这可能是非常艰巨的。

如果您可以找到一个库(或滚动您自己的代码)以Apple plist格式返回您的数据,您的任务将更容易:您可以使用

[NSPropertyListSerialization propertyListFromData:mutabilityOption:format:errorDescription:]

将NSData(或NSMutableData)指针作为其第一个参数。尝试http://code.google.com/p/cfpropertylist/作为起点。


从cfpropertylist页面的示例代码:

$plist = new CFPropertyList();
$td = new CFTypeDetector();  
$guessedStructure = $td->toCFType( $array );
$plist->add( $guessedStructure );
// and then return the plist content with
$plist->toXML()

并在您的iOS代码中:

NSString *errorString = nil;
NSArray *array = [[NSPropertyListSerialization 
                    propertyListFromData:theData
                    mutabilityOption:NSPropertyListImmutable
                    format:nil
                    errorDescription:&errorString] retain];

答案 1 :(得分:1)

我可能会在iOS上使用YAJL,而$ var = json_encode($ array);在PHP中。然后在iOS中,我将从NSData输入中解析该内容,如:

YAJLParser *parser = [[YAJLParser alloc] initWithParserOptions:YAJLParserOptionsAllowComments | YAJLParserOptionsCheckUTF8];
parser.delegate = [[[MyArrayParserDelegate alloc] init] autorelease];
[parser parse:data];
NSArray *thePhpArrayReceived = parser.delegate.resultantArray;

请查看如何构建委托,并在此处获取YAJL:Get YAJL + Readme

答案 2 :(得分:0)

PHP输出文本,因此您必须将NSData读作NSString,然后根据var_dump指定的格式解析数组数据。作为起点,以下代码段应该将数组(作为文本)打印到控制台:

NSString * dump = [[NSString alloc] initWithData:theData
                                        encoding:NSUTF8StringEncoding];

NSLog(@"%@", dump);
[dump release];

正如Seamus Campbell指出的那样,有更好的方法可以做到这一点。另一个选择是从PHP脚本输出XML,然后使用Cocoa的XML解析方法来检索数组。