iOS:如何使用\“\ character获取JSON数据?

时间:2014-04-06 10:32:36

标签: ios objective-c json

我有以下格式的JSON数据:

{ "Data": "{ \"data\": { \"current_condition\": [ {\"cloudcover\": \"0\", \"humidity\": \"33\", \"observation_time\": \"07:40 AM\", \"precipMM\": \"0.0\", \"pressure\": \"1008\", \"temp_C\": \"29\", \"temp_F\": \"84\", \"visibility\": \"10\" } ] }}" }

我可以得到"数据"与

NSError *err=nil;
NSURL *url = [NSURL URLWithString:@"http://something.smthin.com"];
NSData *dataFromUrl = [NSData dataWithContentsOfURL:url];
NSDictionary *object = [NSJSONSerialization JSONObjectWithData:dataFromUrl options:kNilOptions error:&err];
NSDictionary* Data = [object objectForKey:@"Data"];

但是我无法进入" temp_C"因为我不知道如何获取数据,如数据\": 或\" temp_C \":\" 29 \"

在这种情况下,我想得到\" temp_C" \的值为29。 我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

出于某种原因,[object objectForKey:@"Data"]不是字典,而是字符串 包含字典的JSON对象。因此,以下内容应该有效:

NSDictionary *object = [NSJSONSerialization JSONObjectWithData:dataFromUrl options:kNilOptions error:&err];
NSString* tmpString = [object objectForKey:@"Data"];
NSData *tmpData = [tmpString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *data = [NSJSONSerialization JSONObjectWithData:tmpData options:kNilOptions error:&err];

现在data是一个字典,您可以访问其内容,例如

NSDictionary *currentCondition = data[@"data"][@"current_condition"][0];
NSString *tempC = currentCondition[@"temp_C"];

答案 1 :(得分:1)

我无法想象为什么,但你所拥有的是JSON定义一个具有单个属性Data的单个对象,它具有一个字符串值。该字符串包含JSON。例如,你有JSON包装的JSON。

最好的答案可能是修复源代码,因此它不会返回这个奇怪的嵌套结构。

但是,要获得temp_C,首先解码外层并从Data获取字符串。然后解码那个字符串以获取实际信息,如下所示:

{
    "data": {
        "current_condition": [
            {
                "cloudcover": "0",
                "humidity": "33",
                "observation_time": "07:40 AM",
                "precipMM": "0.0",
                "pressure": "1008",
                "temp_C": "29",
                "temp_F": "84",
                "visibility": "10"
            }
        ]
    }
}

从结果对象中获取data属性值(一个对象),然后获取该对象的current_condition属性(一个数组),获取它的第一个条目(一个对象),并从该对象获取temp_C值。

答案 2 :(得分:1)

哇,这搞砸了。你有一个带有单个键和值的JSON。

密钥为Data,值为字符串:{ "data": { "current_condition": [ {"cloudcover": "0", "humidity": "33", "observation_time": "07:40 AM", "precipMM": "0.0", "pressure": "1008", "temp_C": "29", "temp_F": "84", "visibility": "10" } ] }}

因此该值是一个包含内部JSON对象的字符串。

您需要对此进行双重反序列化。

NSDictionary *JSON1 = [NSJSONSerialization JSONObjectWithData:dataFromUrl options: kNilOptions error:&err];
NSData *dataForData = [JSON1[@"Data"] dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *JSON2 = [NSJSONSerialization JSONObjectWithData:dataForData options: kNilOptions error:&err];

NSArray *celciusTemperatures = [JSON2 valueForKeyPath:@"data.current_condition.temp_C"];
NSString *firstCelciusTemperature = [celciusTemperatures firstObject];