我有以下格式的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。 我怎样才能做到这一点?
答案 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)
密钥为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];