使用 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 的类型是数组、字典、字符串、数字和空值。您的字典包含包装NSPoint
s 的NSValue
实例,这些实例不能转换为JSON,因此是例外。您需要将它们替换为一种允许的类型,将点编码为两个值的数组、字典、字符串等。
从您的字典描述中可能不清楚的原因是 NSValue
实例被打印在引号中,但它们实际上不是字符串 - 这只是它们的显示方式。
【讨论】:
那行得通。谢谢。有时这些 po 可以完全带你走向不同的方向!【参考方案2】:JSON 是一个包含数组、字典(javascript 中的“对象”)、字符串、数字和 null (NSNUll) 的结构。您正在尝试将 NSPoint
s 编码为 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?