【问题标题】:Having difficulty parsing a response from an API call难以解析来自 API 调用的响应
【发布时间】:2021-04-27 12:06:18
【问题描述】:

我正在尝试从 API 调用解析响应对象,但遇到了一些困难。

首先,我使用以下内容解析返回的 JSON:

let responseObject = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
if let result = responseObject["result"] {
  print(result)
}

然后,当我记录结果时,我得到以下结果:

{
    "_links" =     {
        next = "/api/3/action/datastore_search?limit=50&id=22f223e7-73f7-4842-935c-80a0ba5c3e5b&offset=50";
        start = "/api/3/action/datastore_search?limit=50&id=22f223e7-73f7-4842-935c-80a0ba5c3e5b";
    };
    fields =     (
                {
            id = "_id";
            type = int;
        },
                {
            id = package;
            info =             {
                label = "";
                notes = "Unique, normalized, name of dataset.
                "type_override" = "";
            };
            type = text;
        }
    )
}

我再次尝试解析:

let finalResult = (try? JSONSerialization.jsonObject(with: result)) as? [String: Any]

但是,我收到以下错误:

对类方法“jsonObject”的调用没有完全匹配

更新

if let result = responseObject["result"] as? [String: Any] {
    if let finalResult = result["records"] {
        print(finalResult)
    }
}

当我记录这个时,我得到以下信息:

(
        {
        "_id" = 186;
        accessibility = 1;
        completeness = "0.6899999999999999";
        freshness = "0.5";
        grade = Silver;
        "grade_norm" = Silver;
        metadata = "0.84";
        package = "air-conditioned-and-cool-spaces-heat-relief-network";
        "recorded_at" = "2019-12-17T20:24:09";
        score = "0.78";
        "score_norm" = "0.76";
        usability = "0.86";
        version = "v0.1.0";
    },
        {
        "_id" = 187;
        accessibility = 1;
        completeness = 1;
        freshness = 0;
        grade = Bronze;
        "grade_norm" = Bronze;
        metadata = "0.25";
        package = "air-conditioned-public-places-cooling-centres";
        "recorded_at" = "2019-12-17T20:24:09";
        score = "0.54";
        "score_norm" = "0.31";
        usability = "0.85";
        version = "v0.1.0";
    },
)

当我尝试迭代这个时:

for (key, value) in finalResult {
    print("key", key)
    print("value", value)
}

我收到以下错误:

元组模式不能匹配非元组类型的值

【问题讨论】:

  • 你想用finalResult做什么?你的结果已经是 json 对象了
  • @valosip 我想提取单个字段并将它们显示在用户界面上。
  • 您的resultNSDictionary 的格式显示。您不应该重新解码它,而应该将其转换为 [String: Any] 并将其用作 Swift 字典。
  • @OOPer 谢谢。没想到是字典。我更新了问题(忽略数据差异。为简洁起见,我已将其截断)
  • 请自行发布您的工作代码作为答案。

标签: ios json swift


【解决方案1】:

感谢@OOPer,我能够将其解析为字典:

if let result = responseObject["result"] as? [String: Any] {
    if let finalResult = result["records"] as? [[String: Any]] {
        finalResult.forEach { (catalogue) in
            if let package = catalogue["package"] as? String {
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2014-01-21
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多