You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中使用Gloss解析JSON数组时result字段解析为nil的问题

问题分析与解决方案

你遇到的核心问题是JSON中result字段是数组类型,但你的结构体定义成了单个对象类型,导致Gloss无法完成解析,所以result才会返回nil。

从你提供的原始数据可以看到:

result = ( { connected = 1; id = 1; latitude = 0; longitude = 0; status = 0; "user_name" = Test; } );

这里的(...)表示这是一个数组(哪怕里面只有一个元素),但你在Hoze_location里把result声明成了Hoze_result?(单个可选对象),类型不匹配自然解析失败。


修复步骤

1. 修改Hoze_location结构体的result类型

把单个对象类型改成数组类型[Hoze_result]?,Gloss会自动处理数组的解析:

import Gloss
import Foundation

struct Hoze_location: JSONDecodable {
    let data: Hoze_Data?
    // 将单个对象改为数组类型
    let result: [Hoze_result]?
    
    init?(json: JSON) {
        self.data = "data" <~~ json
        // 操作符`<~~`支持数组解析,只要类型匹配即可
        self.result = "result" <~~ json
    }
}

2. 访问解析后的数组元素

因为result是数组,你可以通过下标或者first属性获取里面的元素,比如:

Alamofire.request("http://127.0.0.1:8081/user/location", method: .post, parameters: body, headers: myHeader).responseJSON { response in
    guard let jsonDict = response.result.value as? [String: Any] else {
        print("JSON格式错误")
        return
    }
    let my_data = Hoze_location(json: jsonDict)
    
    // 获取数组中的第一个元素
    if let firstResult = my_data?.result?.first {
        print("用户名:\(firstResult.user_name ?? "未知")")
        print("纬度:\(firstResult.latitude ?? 0)")
    }
}

额外注意点

确保后端返回的是标准JSON格式,比如:

{
  "data": {
    "error": 200,
    "format": "JSON",
    "status": "ok"
  },
  "result": [
    {
      "connected": 1,
      "id": 1,
      "latitude": 0,
      "longitude": 0,
      "status": 0,
      "user_name": "Test"
    }
  ]
}

如果后端返回的是你提供的那种类似Objective-C的写法,Alamofire的responseJSON应该也能自动转换为Swift的[String: Any],但如果转换失败,你可能需要先做格式转换。

内容的提问来源于stack exchange,提问作者user9459221

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:44