1

我的应用程序使用 NSTask 启动 Python 脚本,然后脚本通过 NSPipe 返回一个数组。我读取数据,将其粘贴在一个字符串中,然后显示它:

NSMutableData *data = [[NSMutableData alloc] init];
NSData *readData;

while ((readData = [readHandle availableData])&& [readData length]) {
    [data appendData: readData];
}


NSString *string = [[NSString alloc] 
                    initWithData: data 
                    encoding: NSUTF8StringEncoding];

没关系,但我意识到我真的需要将它保存为一个数组 - 而不是一个字符串。我找不到从数据(从 NSPipe 返回的数据)启动数组的方法。我怎样才能做到这一点?我发现最接近的可能是使用:

[NSPropertyListSerialization dataWithPropertyList:format:options:error:]

...但我本身不需要“财产清单”。我必须先将数据转换为 plist 吗?

编辑:我刚刚意识到它比我想象的要复杂。Python 返回一个字典数组,字典中有字符串。这些字符串可以有逗号和其他字符,所以我认为我不能使用“,”分隔符来分解它。

在 Python 中:

msg_set = []
msg_set = [
   dict(mts="t,s1", mfrom="f@ro,m1", msbj="msb,j1", mbody="bod,y1", mid="i,d1"),
   dict(mts="ts2", mfrom="from2", msbj="msb,j2", mbody="body2", mid="id2")
]
print msg_set # <- this is what python returns
4

2 回答 2

1

如果返回的数据表示带有分隔符的数组,例如逗号@",",您可以将字符串拆分为数组,如下所示:

NSString *string = [[NSString alloc] 
                initWithData: data 
                encoding: NSUTF8StringEncoding];
NSArray *array = [string componentsSeparatedByString:@","];

您需要使用与发送方相同的分隔符。如果可以使用多个字符作为分隔符,您可能需要componentsSeparatedByCharactersInSet:改用:

NSArray *array = [string componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
于 2012-08-21T14:56:53.300 回答
1

您可以先将数据转换为 JSON(我看到了对 dasblinkenlight 答案的评论,但我已经输入了答案),然后将它们传递给 Cocoa。像这样的东西:

蟒蛇端

import json
#...
json.dumps(msg_set) # <- return this one instead

Objective-C 端

NSString *myPythonJson = @""; // <- Whatever you got from python
NSError *error = nil;
id myObjectsFromJson = [NSJSONSerialization JSONObjectWithData:[myPythonJson dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
于 2012-08-21T15:40:02.107 回答