【发布时间】:2015-10-13 14:47:26
【问题描述】:
对以下 json 执行 NSJSONSerialization 有时会给我 NSCFString* ,有时会在字符串值上给我 NSTaggedPointerString* 。有谁知道为什么会这样以及 NSJSONSerialization 使用什么来确定它返回的类型?
jsonData = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&parseError];
{
"UserPermissionsService": {
"ServiceHeader": {},
"UserApplicationPermissions": {
"ApplicationPermissions": {
"ApplicationID": "TEST",
"Permission": [
{
"Locations": [
"00000"
],
"PermissionID": "LOGIN"
},
{
"Locations": [
"00000"
],
"PermissionID": "SALES_REPORT_VIEW"
}
]
}
}
}
}
“LOGIN”作为 NSTaggedPointerString* 返回。 “SALES_REPORT_VIEW”返回的是一个 NSCFString*。这对我使用和转换值的下游产生了影响。
更新
这是我学到的……
“当整个值可以保存在指针本身而不分配任何数据时,NSTaggedPointerString 的结果。”
这里有详细的解释...
https://www.mikeash.com/pyblog/friday-qa-2015-07-31-tagged-pointer-strings.html
由于 NSTaggedPointerString 是 NSString 的子类,显示引号/不显示引号对我来说永远不会成为问题,因为使用了数据。
感谢所有评论的人。我很清楚 NSJSONSerialization 在做什么。
【问题讨论】:
-
你在做什么才能有所作为?你总是得到一个 NSString*。 NSString* 的哪个子类对你来说不重要。
-
谷歌搜索 NSTaggedPointerString。如果这对你有影响,那么你做的事情非常非常错误。标记指针在 64 位系统上非常常见,用于小值,整个值可以保存在指针本身中而无需分配任何数据。
-
@Justin Domnitz 我不相信你在这里是正确的,请添加一个你如何使用值或它们的类型的例子。
-
我认为我们在这里有点偏离了轨道。 :) 我真的只是想了解我从 NSJSONSerialization 得到的结果。最佳答案似乎来自 gnasher729 关于系统确定“当整个值可以保存在指针本身而不分配任何数据时产生 NSTaggedPointerString ”。任何人都可以指出我的文档吗?谷歌没有提供任何有用的东西(这就是我在这里发布问题的原因)。
-
大声笑@gnasher729 有人带着问题来到stackoverflow,但收到了更多问题,太好了……此外,贾斯汀如果你找到了答案,请创建一个并将你的标记为已回答。例如,当 NSJSONSerialization 将字典键弄乱为 NSTaggedPointerStrings 并且无法再访问这些值时,我遇到了问题,除非它们被显式强制转换,这使得索引看起来很讨厌
标签: objective-c json nsstring foundation nsjsonserialization