Objective C 中的 __NSSingleObjectArrayI 是什么意思?当我尝试阅读 Json
What means __NSSingleObjectArrayI in Objective C? when I try to read a Json
我有这个代码 Json 格式:
{
"weather": [{
"description": "clear sky",
"icon": "01n"
}],
"base": "stations",
"main": {
"temp": 285.514
},
"clouds": {
"all": 0
},
"dt": 1485792967,
"id": 1907296
}
我想检索图标字符串 (01n)
并使用此代码:
@property(nonatomic,strong) NSString *cityImageName;
self.cityImageName = [[dataJson valueForKey:@"weather"] valueForKey:@"icon"];
稍后当我检查变量打印时:
<__NSSingleObjectArrayI 0x604000009890>(
01n
)
最后如何直接获取字符串?不像__NSSingleObjectArrayI
您陷入了 键值编码陷阱。
valueForKey
有一个特殊的行为。应用于数组时,它 returns 始终是给定键的 所有 值的数组。
切勿使用 valueForKey
,除非您打算使用 KVC。推荐的语法是 objectForKey
或 - 更可取 - 键订阅,如果是数组索引订阅。
在这种情况下,您想要获取键 weather
数组中第一项的键 icon
的值。
self.cityImageName = dataJson[@"weather"][0][@"icon"];
但是如果数组不为空我会添加一个检查以避免超出范围的异常
NSArray *weather = dataJson[@"weather"];
if (weather && weather.count > 0) {
self.cityImageName = weather[0][@"icon"];
}
__NSSingleObjectArrayI
是 NSArray
class cluster 的实现之一。除了知道它是一个数组之外,这对这个问题并不重要。
你得到一个数组(一个元素)而不是一个字符串的原因是因为你正在使用的 JSON 包含一个数组,里面有一个字典:
"weather": [{
"description": "clear sky",
"icon": "01n"
}],
注:大括号两边的方括号。
因此,当您调用 [dataJson valueForKey:@"weather"]
时,您会取回表示 JSON 这部分的对象:
[ { "description": "clear sky", "icon": "01n" } ]
在这种情况下,它已被解码为 NSArray
,其中包含一个 NSDictionary
和两个密钥。
然后调用 valueForKey:
on that array 时
Returns an array containing the results of invoking valueForKey:
using key
on each of the array's objects.
换句话说,因为 [dataJson valueForKey:@"weather"]
是一个字典的数组,所以 [[dataJson valueForKey:@"weather"] valueForKey:@"icon"]
是一个仅包含该字典中 "icon"
键的值的数组。
如果您使用的 JSON 始终采用这种格式,那么您可以从数组中获取 firstObject
以获取第一个字符串(或 nil
如果数组为空)。
我有这个代码 Json 格式:
{
"weather": [{
"description": "clear sky",
"icon": "01n"
}],
"base": "stations",
"main": {
"temp": 285.514
},
"clouds": {
"all": 0
},
"dt": 1485792967,
"id": 1907296
}
我想检索图标字符串 (01n)
并使用此代码:
@property(nonatomic,strong) NSString *cityImageName;
self.cityImageName = [[dataJson valueForKey:@"weather"] valueForKey:@"icon"];
稍后当我检查变量打印时:
<__NSSingleObjectArrayI 0x604000009890>(
01n
)
最后如何直接获取字符串?不像__NSSingleObjectArrayI
您陷入了 键值编码陷阱。
valueForKey
有一个特殊的行为。应用于数组时,它 returns 始终是给定键的 所有 值的数组。
切勿使用 valueForKey
,除非您打算使用 KVC。推荐的语法是 objectForKey
或 - 更可取 - 键订阅,如果是数组索引订阅。
在这种情况下,您想要获取键 weather
数组中第一项的键 icon
的值。
self.cityImageName = dataJson[@"weather"][0][@"icon"];
但是如果数组不为空我会添加一个检查以避免超出范围的异常
NSArray *weather = dataJson[@"weather"];
if (weather && weather.count > 0) {
self.cityImageName = weather[0][@"icon"];
}
__NSSingleObjectArrayI
是 NSArray
class cluster 的实现之一。除了知道它是一个数组之外,这对这个问题并不重要。
你得到一个数组(一个元素)而不是一个字符串的原因是因为你正在使用的 JSON 包含一个数组,里面有一个字典:
"weather": [{
"description": "clear sky",
"icon": "01n"
}],
注:大括号两边的方括号。
因此,当您调用 [dataJson valueForKey:@"weather"]
时,您会取回表示 JSON 这部分的对象:
[ { "description": "clear sky", "icon": "01n" } ]
在这种情况下,它已被解码为 NSArray
,其中包含一个 NSDictionary
和两个密钥。
然后调用 valueForKey:
on that array 时
Returns an array containing the results of invoking
valueForKey:
usingkey
on each of the array's objects.
换句话说,因为 [dataJson valueForKey:@"weather"]
是一个字典的数组,所以 [[dataJson valueForKey:@"weather"] valueForKey:@"icon"]
是一个仅包含该字典中 "icon"
键的值的数组。
如果您使用的 JSON 始终采用这种格式,那么您可以从数组中获取 firstObject
以获取第一个字符串(或 nil
如果数组为空)。