【问题标题】:escaped json string on Swift在 Swift 上转义 json 字符串
【发布时间】:2019-05-24 17:04:46
【问题描述】:

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

响应如下所示:

"[
{
\"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 中是否有等价函数?

【问题讨论】:

  • 短期内没有帮助,但也许您应该与他们联系,让他们知道他们的 JSON 已损坏?也许他们甚至没有意识到这一点。从长远来看,可能会简化事情......
  • myJSONString.replacingOccurrences(of: "\", with: "") 不是一个选项?
  • @Buffalo 所以你目前正在对字符串进行转义。但在那之后你会怎么做?将其作为字典处理?如果是这样,那么最简单的解决方案是将String 转换为Data,然后简单地:try JSONSerialization.jsonObject(with: stringData, options: []) as? [[String: Any]]。但当然最好将其作为Codable 模型处理,在这种情况下,它再次只是try JSONDecoder().decode(MyModel.self, from: stringData)。如果任一解决方案都适合您,那么我将发布一个包含更多详细信息的答案。
  • 那不是 JSON 在 JSON 中字符串化的吗?将其转换为数据,然后将其转换回您的对象(使用可编码)或使用 JSONSerialization 转换为数组。
  • 参见。逻辑(在 Objective-C 中):stackoverflow.com/questions/33149110/… 如果这已经是顶层,您可以使用.allowFragment

标签: json swift


【解决方案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 简直是懒惰的,而且它的设计者恕我直言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2014-01-31
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多