我从API获取一些数据,数据是一个字符串。
po JSON
$22 = 0x26305840 {
"thing_id" = 5192f9053000001;
status = "{\"thing_request_id\":\"51c3a0608906f101f\",\"thing_id\":\"5192f9053000001\",\"status\":\"PICKUP\"}";
}
如何访问内部状态键?不是“stat =”一个。
我通过socketIO连接访问数据。
答案 0 :(得分:1)
您正在寻找的是NSJSONSerialization。
您可以像:
一样使用它NSData *data = [stringJSON dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
id *yourJSON = [JSONObjectWithData:webData options:0 error:&error];
if(error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"You JSON: %@", yourJSON);
}
重要的是要注意它可以返回数组或字典,这段代码只是一个例子。
文档:
答案 1 :(得分:0)
此代码适用于使用不带引号的密钥修复JSON。我是从https://coderwall.com/p/tdra3w
得到的- (NSString *)fixJSON:(NSString *)s {
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"[{,]\\s*(\\w+)\\s*:"
options:0
error:NULL];
NSMutableString *b = [NSMutableString stringWithCapacity:([s length] * 1.1)];
__block NSUInteger offset = 0;
[regexp enumerateMatchesInString:s
options:0
range:NSMakeRange(0, [s length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSRange r = [result rangeAtIndex:1];
[b appendString:[s substringWithRange:NSMakeRange(offset, r.location - offset)]];
[b appendString:@"\""];
[b appendString:[s substringWithRange:r]];
[b appendString:@"\""];
offset = r.location + r.length;
}];
[b appendString:[s substringWithRange:NSMakeRange(offset, [s length] - offset)]];
return b;
}
答案 2 :(得分:0)
我建议添加JSONKit,这样可以很容易地将它放在字典中并访问每个元素。
NSData *jsonData = [yourJSONString dataUsingEncoding:NSUTF8String];
NSDictionary *dictionary = [jsonData objectFromJSONData];
然后,您可以像访问普通的NSDictionary一样访问每个元素。
[dictionary objectForKey:@"status"];//etc
你可以获得JSONKit here
答案 3 :(得分:0)
效率不高的代码,但我只是简单地调用它两次就行了。
NSError *jsonParsingError = nil;
NSDictionary *JSON =
[NSJSONSerialization JSONObjectWithData: [packet.args[0] dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &jsonParsingError];
NSString *lastStatus = [JSON objectForKey:@"status"];
NSDictionary *lastStatusDict = [JSON objectForKey:@"status"];
NSError *jsonParsingError = nil;
NSDictionary *INNERJSON =
[NSJSONSerialization JSONObjectWithData: [lastStatus dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &jsonParsingError];
NSString *innerStatus = [INNERJSON objectForKey:@"status"];
然后我可以使用它
if ([innerStatus isEqualToString:kSENT]) { .....