如何在Swift中将JSON Unmarshal到一个类?

4
如何将 JSON 反序列化到 Swift 类?这是一个展示我所需要的 Go 代码的链接
我找不到任何与Swift相关的参考资料。我查看了其他教程之一教程,但那些例子使用字典,而我想使用对象。
我看到类似于这个的尝试:http://bit.ly/1t3W2Gi ,但该帖子没有将其反序列化为类。
3个回答

4
我们编写了一个开源的、基于协议的Swift框架,叫做ObjectMapper,您可能想考虑一下。从README中可以看到:
为了支持映射,一个类只需要实现MapperProtocol。ObjectMapper使用“<=”运算符来定义每个成员变量如何与JSON进行映射。
class User: MapperProtocol {

  var username: String?
  var age: Int?
  var weight: Double?
  var arr: [AnyObject]?
  var dict: [String : AnyObject] = [:]
  var friend: User?
  var birthday: NSDate?

  // MapperProtocol    
  class func map(mapper: Mapper, object: User) {
    object.username <= mapper["username"]
    object.age <= mapper["age"]
    object.weight <= mapper["weight"]
    object.arr <= mapper["arr"]
    object.dict <= mapper["dict"]
    object.friend <= mapper["friend"]
    object.birthday <= (mapper["birthday"], DateTransform<NSDate, Int>())
  }
}

虽然不像Java的Gson那样不显眼,但它相当轻量级和明确。尽管它还在测试阶段,但我们内部很高兴地使用它。

我正在使用它,它真的很棒。但是...我需要能够发送回服务器,即使模型具有包含其他可映射属性的数组或字典,但是这些属性为空...因此在json中,这种属性将显示为例如:"images":{}。如果这些数组是int数组或其他简单类型,则按预期空发送,但如果它是另一个自定义可映射类型的数组,并且其中没有项目,则不会将其包含在最终JSON中。 - Fawkes
你能在Github上把它记录为一个问题吗?我们会看一下的。 - Nathan Smith

3

现在,您可以使用Codable类型和JSONDecoder来完成此操作。

struct Animal: Codable {
    let type: String
    let sound: String
    let legs: Int
}

let json = """
    [{"type": "dog", "sound": "woof", "legs": 4},
    {"type": "cat", "sound": "meow", "legs": 4},
    {"type": "snake", "sound": "hiss", "legs": 0}]
    """

let data = json.data(using: .utf8)!

do {
    let animals = try JSONDecoder().decode([Animal].self, from: data)
    print(animals)
} catch {
    print("json failed: \(error)")
}

更多信息请参见:
上述内容适用于Swift 3及更高版本。有关早期版本的Swift,可以查看此答案的以前版本,该版本在使用`JSONDecoder`之前。

1
我希望以下链接对于“对象映射器”的使用会有所帮助。
[https://github.com/Hearst-DD/ObjectMapper][1]

你可能没有注意到,但是Nathan的回答——更详细地阐述了这一点——已经链接到了这个。 - Jordan Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接