在Swift上转义的json字符串

时间:2019-05-24 17:04:47

标签: json swift

在使用SWIFT的iPhone应用程序中,我必须处理第三方API,该API发送转义的字符串而不是JSON对象作为响应。

响应如下:

"[
{
\"ID\":3880,
\"Name\":\"Exploration And Production Inc.\",
\"ContractNumber\":\"123-123\",
\"Location\":\"Booker #1\",
\"Volume\":1225.75,
\"OtherFees\":10.0
}
]"

到目前为止,我一直通过处理字符串以删除不需要的字符来处理此问题,直到得到类似JSON的字符串,然后照常进行解析。

Angular有一个方便的功能可以解决此问题:

angular.fromJson(response.data);

Java有自己的处理方式。在Swift中是等效功能吗?

1 个答案:

答案 0 :(得分:1)

如果要将其解析为字典,则最简单的解决方案是将String转换为Data并使用JSONSerialization

if let data = string.data(using: .utf8) {
    do {
        let responseArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]]
        print(responseArray)
    }
    catch {
        print(error)
    }
}

但是,当然最好将其作为Codable模型进行处理,在这种情况下,其处理方法同样简单:

try JSONDecoder().decode([Item].self, from: data)

提供了有效的Decodable模型,如下所示:

struct Item: Decodable {
    let id: Int
    let name: String
    //add the other keys you want to use (note its type sensitive)

    enum CodingKeys: String, CodingKey {
         case id = "ID"
         case name = "Name"
    }
}

最后,请避免使用字符串化的json,因为它很容易导致错误。
字符串变形或结构中的小/大偏差很容易被忽视。
让后端团队知道他们应该遵循其使用者可以依赖的API协议。
通过设置json格式,其本质上就像是一个合同,可以清晰地展示其内容和目的。
发送字符串化的json完全是懒惰的,对其设计者imho的反映很差。