我知道这听起来很复杂,但让我解释一下.

我正在从Web服务获取以下json数据:

{
   "code": 200,
   "object": {
      "id": 1,
      "name": "Peter"
   }
}

因此,我将其转换为jsonObject,然后希望将该对象"提取"到"Person" struct 中

import Foundation

struct Person : Decodable {
    var id : Int
    var name : String
}

let data = """
{
    "code": 200,
    "object": { //this can be any object
        "id": 1,
        "name": "Peter"
    }
}
""".data(using: .utf8)!

do {
    if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
        if json["code"] as! Int == 200 {
            var object = json["object"] as! Data
            
            do {
                let person = try JSONDecoder().decode(Person.self, from: object)
                print(person.name)
            } catch { print(error) }
        } else {
            print("Error")
        }
    }
} catch { print(error) }

也许有一种更简单的方法可以做到这一点,我不知道我是Swift的新手,我也没有找到很多关于这方面的信息.

如果有任何关于这一程序的建议或 comments ,我将不胜感激.

推荐答案

而不是使用JSONSerialization(这是较旧的基础/客观-C API)和SWIFT的Coble,您可以使用Coble来实现这一切:

import Foundation

struct APIResponse<Payload: Decodable>: Decodable { // FIXIME: Name me better
    private enum CodingKeys : String, CodingKey {
        case statusCode = "code"
        case payload = "object"
    }
    
    let statusCode: Int
    let payload: Payload
}

struct Person: Decodable {
    var id: Int
    var name: String
}


let data = """
{
    "code": 200,
    "object": {
        "id": 1,
        "name": "Peter"
    }
}
""".data(using: .utf8)!

let response = try JSONDecoder().decode(APIResponse<Person>.self, from: data)

guard response.statusCode == 200 else {
    // TODO: handle non-happy cases, raise an error, or whatever
}

let person = response.payload
print(person.name) // => Peter

在这里,我使用一个新类型APIResponse,它对包装Person的Outter对象进行建模.我将其泛化,假设这种 struct 可以容纳几种不同类型的负载类型中的一种(取决于从服务器查询的内容).在您的示例中,我使用APIResponse<Person>.

Json相关问答推荐

筛选JSON数组以使用Jolt仅保留具有最新日期/时间的条目

Allof Indide的JSON模式之一

NoneType 对象的 Python 类型错误

震动范围改善

爆炸没有数组的 struct pyspark

使用Powershell将JSON文件加载到SQL Server表格

具有 (RegEx) 模式的 json-schema 中的枚举

Golang gin接收json数据和图片

如何使用nifi从json文件中过滤属性

使用 ConvertFrom-Json 后,Powershell 访问 JSON 中的嵌套对象

在 Perl Mojolicious 中呈现 JSON 时防止转义字符

json.decoder.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)

验证和格式化 JSON 文件

在 Django 1.9 中,使用 JSONField(本机 postgres jsonb)的约定是什么?

gson:将 null 视为空字符串

如何使用 Jackson 注释从 HttpResponse 反序列化 JSON 对象?

使用适用于 Python 的 Google API - 我从哪里获取 client_secrets.json 文件?

POST:在 url 本身中发送 post 请求

Protocol Buffer vs Json - 何时 Select 一个而不是另一个

python追加到json对象中的数组