使用SwiftyJSON解析首元素为数值的JSON文件时无法正确获取元素
解决SwiftyJSON按索引获取嵌套数组中对象字段的问题
首先先明确你的JSON结构应该是类似这样的(根据你的描述):
[ [ {"bv": 0, "ev": 47}, {"bv": 10, "ev": 50} ], [ {"bv": 393, "ev": 1298}, {"bv": 400, "ev": 1300} ] ]
你的现有代码存在几个问题:直接对Data类型的jsonData用下标访问(jsonData![0])是错误的,强制解包jsonData!容易崩溃,循环里的oKey/oKey2也没有定义。下面是修正后的完整实现:
var myBeg: Int = 0 var myEnd: Int = 0 // 安全加载JSON文件 guard let fileURL = Bundle.main.url(forResource: "Blank", withExtension: "json"), let jsonData = try? Data(contentsOf: fileURL), let jsonArray = JSON(jsonData).array else { print("加载或解析JSON失败") return } // 定义一个方法,通过双索引获取对应的bv和ev func getValues(from arrayIndex: Int, objectIndex: Int) -> (bv: Int?, ev: Int?) { // 先检查外层数组索引是否合法 guard arrayIndex < jsonArray.count else { print("外层数组索引越界") return (nil, nil) } let innerArray = jsonArray[arrayIndex] // 检查内层数组索引是否合法 guard objectIndex < innerArray.count else { print("内层数组索引越界") return (nil, nil) } let targetObject = innerArray[objectIndex] // 提取bv和ev,用int获取Optional类型(字段不存在/类型错误时返回nil) let bv = targetObject["bv"].int let ev = targetObject["ev"].int return (bv, ev) } // 测试获取(0,0)的值 if let (bv0, ev0) = getValues(from: 0, objectIndex: 0) { myBeg = bv0 myEnd = ev0 print("(0,0) -> bv: \(bv0), ev: \(ev0)") // 输出 bv:0, ev:47 } // 测试获取(1,0)的值 if let (bv1, ev1) = getValues(from: 1, objectIndex: 0) { print("(1,0) -> bv: \(bv1), ev: \(ev1)") // 输出 bv:393, ev:1298 }
关键说明:
- 用
Bundle.main.url替代path,更安全且符合现代Swift写法 - 用
JSON(jsonData).array先确认顶层是数组结构,避免后续访问出错 - 自定义的
getValues方法做了两层索引的越界检查,防止数组下标越界崩溃 - 用
int获取Optional类型的数值(如果字段可能不存在或类型不对,不会崩溃);如果需要默认值,可以改用intValue(不存在时返回0)
内容的提问来源于stack exchange,提问作者Douglas W. Palme
相关产品推荐
相关产品推荐

