使用Swift 4 Decodable进行JSON /简单文本解析服务器响应

时间:2018-03-25 14:09:26

标签: json swift parsing codable

我遇到了以下麻烦。通过客户端iOS应用程序与特定的后端服务协作发送2种类型的响应:成功时的JSON和错误的简单文本。

对于JSON,我有简单的可解码结构:

    struct Response: Decodable {
        let message: String
    }

并且直到服务器在http正文中发送简单文本并且我收到以下错误:

  

"错误域= NSCocoaErrorDomain代码= 3840" JSON文本未启动   使用数组或对象以及允许未设置片段的选项。"

对于这种情况,响应结构可能更普遍吗?

1 个答案:

答案 0 :(得分:2)

没有简单的方法让你的Decodable结构处理这样的错误,因为如果您尝试解码的Data不是有效的JSON,{{1方法甚至不被调用,因此您需要处理初始化程序范围之外的错误。

一种可能的解决方案是处理init(from decoder:)方法的catch块中的错误。一旦JSONDecoder.decode(Response.self,from:)函数抛出错误,您可以检查错误是否是由于输入错误(在这种情况下,很可能意味着输入是一个简单的字符串而不是JSON)并且您可以简单地转换响应数据到decode,然后调用String的成员初始化程序,用字符串响应初始化它。

以下示例显示如何使用两个示例响应来处理此类情况,一个是有效的JSON,另一个是简单的字符串。

Response