JSON是一个字符串?我该如何访问它?

时间:2013-06-21 00:54:36

标签: ios objective-c json socket.io

我从API获取一些数据,数据是一个字符串。

po JSON
$22 = 0x26305840 {
    "thing_id" = 5192f9053000001;
    status = "{\"thing_request_id\":\"51c3a0608906f101f\",\"thing_id\":\"5192f9053000001\",\"status\":\"PICKUP\"}";
}

如何访问内部状态键?不是“stat =”一个。

我通过socketIO连接访问数据。

4 个答案:

答案 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);
}

重要的是要注意它可以返回数组或字典,这段代码只是一个例子。

文档:

http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html

答案 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]) { .....