Swift Codable将空json解码为nil或空对象 [英] Swift Codable decode empty json as nil or empty object

查看:331
本文介绍了Swift Codable将空json解码为nil或空对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的代码:

class LoginUserResponse : Codable {
    var result: String = ""
    var data: LoginUserResponseData?
    var mess: [String] = []
}

public class LoginUserResponseData : Codable {
    var userId = "0"
    var name = ""
}

现在,调用服务器API时我正在像这样解析响应(使用简化解析的资料库):

Now, calling the server API I'm parsing response like this (using Stuff library to simplify parsing):

do {
    let loginUserResponse = try LoginUserResponse(json: string)
} catch let error {
    print(error)
}

当我输入正确的密码,我得到这样的答案:

When I enter the correct password I'm getting an answer like this:

{"result":"success","data":{"userId":"10","name":"Foo"},"mess":["You're logged in"]}

这很好,解析器正常工作。

This is fine, the parser is working correctly.

虽然提供了错误的密码,但给出了以下答案:

While providing wrong password gives the following answer:

{"result":"error","data":{},"mess":["Wrong password"]}

在这种情况下,解析器失败。它应该将数据设置为nil,但是,它尝试将其解码为LoginUserResponseData对象。

In this situation, the parser is failing. It should set data to nil, but instead, it tries to decode it to the LoginUserResponseData object.

我在Android上使用相同的方法进行翻新,并且效果很好。我宁愿不要将所有字段都设为可选。

I'm using the same approach on Android using retrofit and it works fine. I rather don't want to make all fields as optional.

有没有一种方法可使解析器将空json {}视为nil?还是将LoginUserResponseData设为非可选,并且仅使用默认值?我知道我可以为此创建一个自定义解析器,但是我有很多这样的请求,这将需要太多额外的工作。

Is there a way to make parser treat empty json {} as nil? Or make LoginUserResponseData as non-optional and it'll just have default values? I know I can create a custom parser for this, but I have tons of requests like this and it'll require too much additional work.

推荐答案

那样简单!

class LoginUserResponse : Codable {
    var result: String = ""
    var data: LoginUserResponseData?
    var mess: [String] = []

    private enum CodingKeys: String, CodingKey {
        case result, data, mess
    }

    required init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        result = try values.decode(String.self, forKey: .result)
        mess = try values.decode([String].self, forKey: .mess)
        data = try? values.decode(LoginUserResponseData.self, forKey: .data)
    }
}

public class LoginUserResponseData : Codable {
    var userId = "0"
    var name = ""
}

let str = "{\"result\":\"success\",\"data\":{\"userId\":\"10\",\"name\":\"Foo\"},\"mess\":[\"You're logged in\"]}"
let str2 = "{\"result\":\"error\",\"data\":{},\"mess\":[\"Wrong password\"]}"

let decoder = JSONDecoder()
let result = try? decoder.decode(LoginUserResponse.self, from: str.data(using: .utf8)!)
let result2 = try? decoder.decode(LoginUserResponse.self, from: str2.data(using: .utf8)!)
dump(result)
dump(result2)

这篇关于Swift Codable将空json解码为nil或空对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆