【问题标题】:JSON as a string? How can I access it?JSON作为字符串?我怎样才能访问它?
【发布时间】:2013-06-21 00:54:36
【问题描述】:

我正在从 API 取回一些数据,这些数据是一个字符串。

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

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

我正在通过 socketIO 连接访问数据。

【问题讨论】:

  • 您想使用库将其反序列化为本机对象。这个问题可能会给您带来正确的方向stackoverflow.com/questions/7172001/…
  • 是的,除了可以使用正则表达式处理的一些非常有限的情况外,您需要在访问 JSON 中的值之前将 JSON 解析为目标语言中的对象>
  • @HotLicks 嗯嗯什么?
  • 解析。你知道,使用 NSJSONSerialization、JSON-Framework、JSONKit、yajl-objc、TouchJSON 或 ObjFW。任君挑选。

标签: ios objective-c json socket.io


【解决方案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

【讨论】:

    【解决方案2】:

    此代码适用于使用未引用的密钥修复 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;
    }
    

    【讨论】:

      【解决方案3】:

      我建议添加 JSONKit,这样可以很容易地将其放入字典并访问每个元素。

      NSData *jsonData = [yourJSONString dataUsingEncoding:NSUTF8String];
      NSDictionary *dictionary = [jsonData objectFromJSONData];
      

      然后您可以像访问普通 NSDictionary 一样访问每个元素。

      [dictionary objectForKey:@"status"];//etc
      

      您可以获取JSONKit here

      【讨论】:

        【解决方案4】:

        不是高效的代码,但我只是简单地调用了两次就可以了。

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

        【讨论】:

          猜你喜欢
          • 2016-05-10
          • 1970-01-01
          • 1970-01-01
          • 2021-01-23
          • 1970-01-01
          • 2015-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多