使用 NSJSONSerialization 将 NSDictionary 转换为 NSData

Posted

技术标签:

【中文标题】使用 NSJSONSerialization 将 NSDictionary 转换为 NSData【英文标题】:Converting NSDictionary to NSData using NSJSONSerialization 【发布时间】:2017-04-24 06:41:04 【问题描述】:

我有一本如下图所示的字典


childViews =     (
            
        childViews =             (
                            
                childViews =                     (
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 80.166666666666671, 20.166666666666668";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 160, 110";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 130, 20.166666666666668";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 210, 160";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 130, 20.166666666666668";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 210, 210";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 130, 20.166666666666668";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 210, 260";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 130, 20.166666666666668";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 210, 260";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 130.16666666666666, 20.166666666666668";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 210, 310";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 130, 20.166666666666668";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 210, 360";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 129.83333333333334, 20.166666666666668";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 210, 410";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                                                            
                                        childViews =                                             (
                                        );
                                        properties =                                             
                                            center = "NSPoint: 0, 0";
                                        ;
                                    
                                );
                                properties =                                     
                                    center = "NSPoint: 207, 500.5";
                                ;
                            ,
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 207, 671.83333333333326";
                                ;
                            ,
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 409.83333333333337, 641";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 217, 368";
                        ;
                    ,
                                            
                        childViews =                             (
                                                            
                                childViews =                                     (
                                );
                                properties =                                     
                                    center = "NSPoint: 70, 29.833333333333336";
                                ;
                            
                        );
                        properties =                             
                            center = "NSPoint: 80, 716";
                        ;
                    
                );
                properties =                     
                    center = "NSPoint: 207, 368";
                ;
            
        );
        properties =             
            center = "NSPoint: 207, 368";
        ;
    
);
properties =     
    center = "NSPoint: 207, 368";
;

当我尝试使用代码将此字典转换为 NSData 时

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self toDictionary]
                                                   options:NSJSONWritingPrettyPrinted
                                                     error:&error];

我收到错误

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSConcreteValue)'

我需要帮助来了解可能导致此崩溃的值。

【问题讨论】:

你正在使用 ResponseObjetct instedof [self toDictionary]。 【参考方案1】:

正如documentation 中提到的,唯一可以通过NSJSONSerialization 直接转换为JSON 的类型是数组、字典、字符串、数字和空值。您的字典包含包装NSPoints 的NSValue 实例,这些实例不能转换为JSON,因此是例外。您需要将它们替换为一种允许的类型,将点编码为两个值的数组、字典、字符串等。

从您的字典描述中可能不清楚的原因是 NSValue 实例被打印在引号中,但它们实际上不是字符串 - 这只是它们的显示方式。

【讨论】:

那行得通。谢谢。有时这些 po 可以完全带你走向不同的方向!【参考方案2】:

JSON 是一个包含数组、字典(javascript 中的“对象”)、字符串、数字和 null (NSNUll) 的结构。您正在尝试将 NSPoints 编码为 JSON,而 JSON 不是为此而设计的。我建议将点转换为字符串或对象(例如:x:160, y:110)。

另请参阅https://developer.apple.com/reference/foundation/jsonserialization,了解可以将哪些对象转换为 JSON 的完整说明。

【讨论】:

但是,字符串中不存在 - 这是我的困惑。它不应该按原样编码吗? 不,它们不是字符串。正如 Itai 所指出的,它们在日志中看起来像字符串,但它们不是字符串。

以上是关于使用 NSJSONSerialization 将 NSDictionary 转换为 NSData的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSJSONSerialization 将 NSDictionary 转换为 NSData

无法使用 NSJSONSerialization 将数字转换为 JSON 值

通过 NSJSONSerialization 下载 JSON 数据

NSJSONSerialization 拆箱 NSNumber?

如何让 NSJSONSerialization 将布尔值输出为真或假?

使用 NSJSONSerialization 反序列化压缩的 JSON 文件