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
相关产品推荐
相关产品推荐

