JSONKit反序列化问题

Posted

技术标签:

【中文标题】JSONKit反序列化问题【英文标题】:JSonKit deserialization problem 【发布时间】:2011-08-27 23:23:09 【问题描述】:

我有 JSON 作为 NSString:

["bus_number":"1","created_at":"2011-08-15T23:07:52Z","id":1,"model":"Setra","registar_number":"123456","seats":50,"tour_id":1,"updated_at":"2011-08-15T23:07:52Z","bus_number":"2","created_at":"2011-08-15T23:07:52Z","id":2,"model":"Mercedes","registar_number":"2234","seats":60,"tour_id":1,"updated_at":"2011-08-15T23:07:52Z"]

我正在尝试将此 NSString 转换为 NSDictionary。

当我使用时:

NSDictionary *sourceDictionary = [[response bodyAsString] objectFromJSONString];

我得到这样的 NSDictionary:

(
    
    "bus_number" = 1;
    "created_at" = "2011-08-15T23:07:52Z";
    id = 1;
    model = Setra;
    "registar_number" = 123456;
    seats = 50;
    "tour_id" = 1;
    "updated_at" = "2011-08-15T23:07:52Z";
,
    
    "bus_number" = 2;
    "created_at" = "2011-08-15T23:07:52Z";
    id = 2;
    model = Mercedes;
    "registar_number" = 2234;
    seats = 60;
    "tour_id" = 1;
    "updated_at" = "2011-08-15T23:07:52Z";

)

但是,这个 NSDictionary 有一个问题,我无法访问它们的元素,有些元素不是 NSStrings(比如模型)。

如何使用 NSStrings 将 JSONString 转换为 NSDictionary?

编辑:

当我尝试登录控制台时:

for (id key in sourceDictionary) 
            NSLog(@"key: %@, value: %@", key, [sourceDictionary objectForKey:key]);
        

我得到异常:

-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x1c3a50

【问题讨论】:

你没有得到一个 NSDictionary 这行 NSDictionary *sourceDictionary = [[response bodyAsString] objectFromJSONString];,你得到一个 NSArray 怎么样?对象类是 NSDictionary :-o objectFromJSONString 返回 id,在这种情况下,它可以返回 NSArray 或 NSDictionary。仅仅因为您选择将变量声明为 NSDictionary *sourceDictionary 并不意味着它将成为字典。你的帖子有两个证明:A)例外(它说 sourceDictionary 它实际上是一个数组)。 B)你得到的“字典”有两个对象,但这些对象没有键,因为它实际上是一个数组;) 【参考方案1】:

如果您是从 RestKit 获得的,并且看起来确实如此,您可以这样做:

NSMutableDictionary *myDictionary = [response.body mutableObjectFromJSONData];

这样,您可以提取原始二进制数据,并且可以避免在此过程中来回转换为字符串的一些不必要(且成本高昂)。另外,我规定了可变的,因为当您获得数据时,您很可能想要操纵或处理数据......再次,JSONKit 超类中的非可变对象和可变对象之间的转换涉及成本......因此,从一开始就使用 mutable,您只是节省了一些时间。

【讨论】:

【参考方案2】:

这些实际上是 NSStrings,当您将它们打印到控制台时,它们只是没有引号。

【讨论】:

为什么例如“registar_number”有引号而模型没有? 通常如果只有字母(没有其他符号),它将不带引号显示。 谢谢回答。我刚刚编辑了问题,为什么会出现这个错误?这个循环应该适用于任何带有 NSStrings 的 NSDictionary

以上是关于JSONKit反序列化问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 jsonkit 将 JSonString 反序列化为 NSArray

如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?

php反序列化漏洞复现

Json.net反序列化不反序列化所有属性

ctf serialize 序列化和反序列化

如何序列化/反序列化的ArrayList