【问题标题】:Could not cast value of type 'NSNull' to 'NSString' in parsing Json in swift在快速解析 Json 时无法将“NSNull”类型的值转换为“NSString”
【发布时间】:2016-07-15 05:05:45
【问题描述】:

我有以下课程

class BannerResponse : NSObject{

    let  URL                = "Url";
    let  CONTACT_NO         = "ContactNo";
    let  IMAGE              = "Image";
    let  BIG_IMAGE          = "BigImage";
    let  ID                 = "Id";
    let  TITLE              = "Title";
    let  NO_VIEW            = "NoView";
    let  START_DATE         = "StartDate";
    let  END_DATE           = "EndDate";


    var url:String;
    var contactNo:String;
    var image:String;
    var bigImage:String;
    var title:String;
    var id:Int;
    var noView:Int;
    var startDate:String;
    var endDate:String;

    init(data : NSDictionary){

        url         = data[URL] as! String;
        contactNo   = data[CONTACT_NO] as! String;
        image       = data[IMAGE] as! String;
        bigImage    = data[BIG_IMAGE] as! String;
        title       = data[TITLE] as! String;
        id          = data[ID] as! Int;
        noView      = data[NO_VIEW] as! Int;
        startDate   = data[START_DATE] as! String;
        endDate     = data[END_DATE] as! String;
    }
}

当我运行代码时,出现以下错误

Could not cast value of type 'NSNull' (0x10a85f378) to 'NSString' (0x109eccb20).

编辑

do {

                            if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary{

                                onSuccess(BannerResponse(data: json))
                            }
                        } catch {

                            onFail()
                        }

【问题讨论】:

  • 你是怎么得到这本词典的?您是在使用 NSJSONSerialization 还是其他库来解析 JSON?
  • @DuncanC 请检查我的编辑

标签: ios json swift


【解决方案1】:

您的某些键得到空值。它们通过 NSJSONSerialization 映射到 NSNull。

你需要做几件事

将所有变量(urlcontactNo 等)更改为可选项:

var url:String?
var contactNo:String?

将所有作业更改为使用? 而不是!

url = noNulls[URL] as? String
contactNo = noNulls[CONTACT_NO] as? String

最后,让您的代码处理所有变量的 nil 值。 (但不要使用!。该路径会导致崩溃。)

【讨论】:

  • 非常感谢您的帮助:)
  • noNull 的那一步完全没有必要。 as? String 可以处理 NSNull 就好了。
【解决方案2】:

您的其中一个data[SOME_KEY]NSNull 而不是String 类型,因为您通过使用! 强制转换为String,应用程序崩溃。

你可以做以下两件事之一:

  1. 将 BannerResponse 类上的变量更改为可选。在 init 方法中设置值时,请使用 ? 而不是 !。像这样:

`

var title: String?

init(data: NSDictionary) 
{
    self.title = data[TITLE] as? String
}

  1. init 方法中设置值时使用? 而不是!,但只要dict[SOME_KEY] 为nil 或不是预期的类型,请设置默认值。这看起来像这样:

`

if let title = data[TITLE] as? String 
{
    self.title = title
}
else
{
    self.title = "default title"
}

// Shorthand would be: 
// self.title = data[TITLE] as? String ?? "default title"

我猜第三件事是确保服务器永远不会发送空值。但这是不切实际的,因为没有永远不会这样的事情。您应该编写客户端代码以假设 JSON 中的每个值都可以为 null 或意外类型。

【讨论】:

  • 非常感谢您的帮助:)
猜你喜欢
  • 2017-04-10
  • 2019-05-02
  • 2016-06-06
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
相关资源
最近更新 更多