或者我可以检查一个数字是否被解码为十进制数而不是整数?
if let int = any as? Int {
print("Object in an integer")
} else if let num = any as? Double {
print("Object in a double")
}
,其中“any”是 JSON 文件中的 Any 值并且 = 1.0(不是字符串)。 “any”可以转换为整数和 double (因此我检查的顺序决定结果),但我想保留 JSON 文件中的原始格式。
使用以下行完成解码:
let json = try JSONSerialization.jsonObject(with: data, options: [])
编辑:我尝试检查 CFType,但 1 和 1.0 都得到相同的结果(受到 http://stackoverflow.com/a/30223989/1694526 的启发)
有什么想法吗?
最佳答案
正如 @Sulthan 已经提到的,这在您正在工作的级别上是不可能的,因为 JSONSerialization
将并且应该使用单个类来表示值,并且可能无法确定其类型。
您可以尝试寻找其他工具来检查值,但这真的有意义吗?
- 您正在尝试查找
Int
和Double
之间的差异,但是 64 位或 32 位呢?或者签名和未签名?我们通常不会将它们写入字符串,因此实际上无法区分它们。所以这样做确实没有一般逻辑。 - 您确定返回的 JSON 始终会为这些值附加“.0”吗?这实际上取决于系统,最小的优化会消除这一点,因为 JSON 标准不包括数字精度。例如,如果我使用
JSONSerialization
并打印出String(data: (try! JSONSerialization.data(withJSONObject: [ "value": 1.0 ], options: .prettyPrinted)), encoding: 。 utf8)
我收到:{\n\"value\": 1\n}
这意味着它无论如何都会修剪“.0”。 - 我发现很难理解这在结构上会有什么好处。例如,如果您需要将这些数据保存到数据库中,则需要定义用于保存数据的基元的大小和类型。如果您需要使用一些算术,您再次需要指定类型...
唯一的方法是将其用作显示字符串。但在这种情况下,您的值应该作为字符串而不是数字返回。
关于ios - 在 Swift 4 中解析 JSON 中的 double (例如 1.0)而不丢失小数点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48338800/