【问题标题】:What means __NSSingleObjectArrayI in Objective C? when I try to read a JsonObjective C 中的 __NSSingleObjectArrayI 是什么意思?当我尝试阅读 Json
【发布时间】:2018-04-06 23:23:46
【问题描述】:

我有这个代码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:而不是objectForKey:
  • 虽然两个答案都是正确的并解释出了什么问题 (valueForKey:),但要回答您的问题,这是一个内部类:“NSArray”“不可变”(对于“我”在最后,反对可变版本,但这对于“NSArray”与“NSMutableArray”是隐含的)并且针对只有一个对象(“SingleObject”部分)进行了优化。

标签: objective-c json nsstring nsarray


【解决方案1】:

你陷入了键值编码陷阱

valueForKey 有一个特殊的行为。应用于数组时,它始终返回给定键的所有值数组。

除非您打算使用 KVC,否则切勿使用 valueForKey。推荐的语法是 objectForKey 或 - 首选 - 键订阅和数组索引订阅。

在这种情况下,您希望获取键 weather 数组中第一项的键 icon 的值。

self.cityImageName = dataJson[@"weather"][0][@"icon"];

但是我会添加一个检查数组是否为空以避免超出范围的异常

NSArray *weather = dataJson[@"weather"];
if (weather && weather.count > 0) {
    self.cityImageName = weather[0][@"icon"];
}

【讨论】:

  • 这是一个很好的答案。现在我明白了如何处理这种情况。
  • 我无法通过这个获得价值
【解决方案2】:

__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它时

返回一个数组,其中包含在每个数组对象上使用key 调用valueForKey: 的结果。

换句话说,因为[dataJson valueForKey:@"weather"] 是一个字典的数组,所以[[dataJson valueForKey:@"weather"] valueForKey:@"icon"] 是一个仅包含该字典中"icon" 键值的数组。

如果您使用的 JSON 始终具有这种格式,那么您可以从数组中获取 firstObject 以获取第一个字符串(如果数组为空,则为 nil)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 2014-01-17
    • 2011-02-16
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多