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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:08:24