无法将“__NSCFBoolean”(0x100b123b8)类型的值转换为“NSString”(0x100f0ab48)

Posted

技术标签:

【中文标题】无法将“__NSCFBoolean”(0x100b123b8)类型的值转换为“NSString”(0x100f0ab48)【英文标题】:Could not cast value of type '__NSCFBoolean' (0x100b123b8) to 'NSString' (0x100f0ab48) 【发布时间】:2016-07-30 19:20:17 【问题描述】:

我正在尝试解析一个 .json 文件,但我以为我快结束了,发生了错误:

无法将“__NSCFBoolean”(0x10c8ba3b8) 类型的值转换为“NSString”(0x10ccb2b48)。

我已经完成了我的研究,我发现(惊讶地)我的 .json 中有一些布尔值在字符串的舞台上乱七八糟...

那么我该如何避免这种情况呢?在尝试将 bar["tags"] 放入 String 之前,我已经查找了一些方法可以给我 bar["tags"] 的类型,但我找不到..

这是 .json 和我的(太长的)代码的摘录:

...
    "id": 3906,
    "address": "L\u2019Hotel le 123 Sebastopol 23, boulevard S\u00e9bastopol, Paris, 75002, Le Louvre, Paris",
    "name": "123 Sebastopol",
    "url": "/bar/paris/le-louvre/123-sebastopol",
    "image_url": "https://prh-wbb-prod.s3.amazonaws.com/generic_640_480/WBB%20holding%20image3_54abcf7d218d1_55b8d2128eabb.jpg",
    "tags": "Hotel, Cocktail, Terrace",
    "latitude": 48.867598851356,
    "longitude": 2.3533117460327
, 
    "id": 1523,
    "address": "73 Rue d\u0027Aboukir, 75002 Paris, France, Le Louvre, Paris",
    "name": "Lockwood",
    "url": "/bar/paris/le-louvre/lockwood",
    "image_url": "https://prh-wbb-prod.s3.amazonaws.com/bar_640_480/lockwood_001_553f5b2c99f4b.jpg",
    "tags": false,
    "latitude": 48.867716087563,
    "longitude": 2.3469846706722
...

我的代码:

id = (bar["id"] as? Int)!
name = (bar["name"] as? String)!
adress = (bar["address"] as? String)!
url = (bar["url"] as? String)!
image_url = (bar["image_url"] as? String)!

tags = (bar["tags"] as? String)!

latitude = (bar["latitude"] as? Double)!
longitude = (bar["longitude"] as? Double)!

【问题讨论】:

在您的 JSON "tags": false, 中。这是导致错误的原因。 您的第一个存根将 tags 显示为字符串,第二个存根将其显示为布尔值。这就是错误的原因。 这一行会引发错误 tags = (bar["tags"] as?String)! “标签”应该是一个字符串(200/208)所以我只想用一个空字符串替换 false 【参考方案1】:

嗯,好像我没有做足够的研究!

解决办法如下:

if let test = bar["tags"] as? String 
    tags = (bar["tags"] as? String)!
else
    tags=" "

【讨论】:

【参考方案2】:

您正在尝试将 Bool 值 - false - 解析为 String 的实例。

将您的代码更改为:

id = (bar["id"] as? Int)!
name = (bar["name"] as? String)!
adress = (bar["address"] as? String)!
url = (bar["url"] as? String)!
image_url = (bar["image_url"] as? String)!

tags = (bar["tags"] as? Bool)!

latitude = (bar["latitude"] as? Double)!
longitude = (bar["longitude"] as? Double)!

【讨论】:

【参考方案3】:

当我决定在 Swift3 下解析 JSON 并且没想到结果是 Bool 时,我遇到了类似的问题。

这是我的代码,希望它能帮助像我这样不喜欢 Swift 3 的人。

在我的情况下,JSON 输出中的条目是

success = 0;

注意它没有 "" 围绕 success0 像这样

"success" = "0"

这是我用来从 JSON 输出中获取 Bool 值的代码

success = 0

注意没有“”

let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if (jsonResult?["success"] as? Bool)!
 
      okToLogIn = true
      print(okToLogIn)
 
 else
 
       okToLogIn = false
       print(okToLogIn)
 

所以我只是将它保留为 Bool 并检查真假,我的代码现在可以正常工作了。

【讨论】:

以上是关于无法将“__NSCFBoolean”(0x100b123b8)类型的值转换为“NSString”(0x100f0ab48)的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中检查 NSCFBoolean?

SQL Server Management Studio 无法将类型为“System.__ComObject

为啥我无法正确获取图像数据或无法将数据发送到服务器?

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端

C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable

无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS