我正在为C ++类编写Objective-C包装器。在OC方面,我必须拿一个NSData
(从json文件中读取)从中获取一个列表并将其转换为std::vector< std::string >
。这是我到目前为止的代码(在mm
文件中):
NSData *input = [NSData dataWithContentsOfFile:[NSString stringWithUTF8String:"1455469592904_acceldata742283.json"]];
NSError* error;
NSDictionary* jsonArray = [NSJSONSerialization JSONObjectWithData:input options:NSJSONReadingMutableContainers error:&error];
NSMutableArray *accdata = [jsonArray valueForKeyPath:@"data.accelerometer" ];
int size = [accdata count];
vector<string> cppAccdata;
for (int i = 0; i< size; i++){
//~ cppAccdata.push_back();
NSLog(@"%@",[accdata objectAtIndex:i]);
}
accdata
松散地说是一个字符串列表。 json文件基本上看起来像这样(有更多的行但是旁边的点):
{
"data" : {
"accelerometer" : [
"1455463005.714 -8.311620700836182 -3.969735990142822 -3.737648066711425",
"1455463005.724 -8.256703700256347 -4.017769660949707 -3.680336864471435" ] }}
代码的输出是:
2016-02-15 14:18:16.212 test-OC[10300] 1455463066.241 -7.960421244812011 -4.400093738555908 -3.746177410125732
2016-02-15 14:18:16.212 test-OC[10300] 1455463066.261 -8.019677735900878 -4.377498460388184 -3.634847032928467
2016-02-15 14:18:16.212 test-OC[10300] GSCBufferString
从技术上讲,我需要将[accdata objectAtIndex:i]
转换为std :: string,我猜这可以通过C const char *
工作,但是我无法找到任何关于将GSCBufferString
转换成任何东西的东西。我怎样才能做到这一点?也许有一种更优雅的方式来循环accdata
。
NSArray *accdata = [jsonArray valueForKeyPath:@"data.accelerometer" ];
vector<string> cppAccdata;
for (NSString *str in accdata) {
cppAccdata.push_back(str.UTF8String);
}
试试这个:
NSArray *jsonArray;
NSArray *accData = [jsonArray valueForKeyPath:@"data.accelerometer"];
vector<string> cppAccdata;
for (NSString *str in accData){
std::string *accString = new std::string([str UTF8String]);
cppAccdata.push_back(*accString);
}
提出的两个答案在进行转换时是正确的,但是循环语法没有编译。这种解决方法有效:
int size = [accdata count];
vector<string> cppAccdata;
for (int i = 0; i< size; i++){
cppAccdata.push_back([[accdata objectAtIndex:i] UTF8String]);
}