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"];
}

__NSSingleObjectArrayINSArray 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如果数组为空)。