JSONKit 返回不需要的 NSCFString 而不是 NSDictionary

Posted

技术标签:

【中文标题】JSONKit 返回不需要的 NSCFString 而不是 NSDictionary【英文标题】:JSONKit returning unwanted NSCFString rather than NSDictionary 【发布时间】:2013-05-13 09:30:06 【问题描述】:

我一直在努力找出这里出了什么问题,由于某种原因,JSONKit 没有给我我需要的字典,所以我可以在 plist 中引用特定的键/值对。

而是显示为NSCFString,这显然不符合ObjectForKey: 之类的方法。我四处寻找解决方案;告诉我禁用 ARC,重新启动/重新安装 xcode,以及各种不同的实现,但没有任何变化。更糟糕的是,我在另一个具有相同功能的项目中实际上拥有相同的代码块,并且它可以无缝运行。

NSError * error = NULL;
NSData * plistData = [NSData dataWithContentsOfFile:filepath];
id plist = [NSPropertyListSerialization propertyListWithData:plistData options:NSPropertyListImmutable format:NULL error:&error];
NSString * jsonString = [plist JSONStringWithOptions:JKSerializeOptionPretty error:&error];
NSDictionary * returnDictionary = [jsonString objectFromJSONString];
for(id elem in returnDictionary)

    for(id elements in elem)
    
        NSLog(@"%@",elements);
    

给出的错误:

-[NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x1815750

有问题的plist:

<dict>
    <key>20003</key>
    <dict>
        <key>type</key>
        <string>1</string>
        <key>name</key>
        <string>Home Name</string>
        <key>font</key>
        <string>Courier</string>
        <key>size</key>
        <string>22</string>
        <key>color</key>
        <string>FFFFFFFF</string>
    </dict>
    <key>20001</key>
    <dict>
        <key>type</key>
        <string>1</string>
        <key>name</key>
        <string>heyhey</string>
        <key>font</key>
        <string>XXX</string>
        <key>size</key>
        <string>11</string>
        <key>color</key>
        <string>FFFF0000</string>
    </dict>
</dict>
</plist>

【问题讨论】:

NSLog() plistjsonStringreturnDictionaryelem 会得到什么? 【参考方案1】:

问题不是 JSONKit 没有返回 NSDictionary。

问题是,当您通过 NSDictionary 进行枚举时,您得到的是“键”,而不是“值”。

所以,对于以下代码:

for(id elem in returnDictionary) for(elem 中的 id 元素) NSLog(@"%@",元素);

外循环中elem的类型是字典中每个条目的“键”。 (从您的 plist 中,一个字符串)

改成

for(id elem in returnDictionary) id val = returnDictionary[ elem ]; for(val 中的 id 元素) NSLog(@"%@",元素);

看看有没有帮助

【讨论】:

或者:for (id elem in [returnDictionary allValues]) 用于外循环

以上是关于JSONKit 返回不需要的 NSCFString 而不是 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

fetchedResultsController fetchedObjects 返回一个 NSCFString 而不是 NSArray

iOS7 只返回 'NSInvalidArgumentException',原因:'-[__NSCFString containsString:]: [duplicate]

iOS JSONKit objectWithData 返回 null

NSJSONSerialization生成NSCFString *和NSTaggedPointerString *

Alamofire 无法将 NSCFString 类型转换为字典

OC中处理json解析出NSCFString