swiftswifty-json

Parsing JSON file with SwiftyJSON not returning correct elements when first two elements are numeric values


I am having an issue parsing out a json file with swiftyjson that has two numeric values for the first two elements.

JSON File

[
  [
    {
      "bv": 0,
      "ev": 30
    },
    {
      "bv": 31,
      "ev": 55
    },
    {
      "bv": 56,
      "ev": 79
    },
    {
      "bv": 80,
      "ev": 105
    },
    {
      "bv": 106,
      "ev": 137
    },
    {
      "bv": 138,
      "ev": 159
    },
    {
      "bv": 160,
      "ev": 183
    },
    {
      "bv": 184,
      "ev": 205
    },
    {
      "bv": 206,
      "ev": 234
    },
    {
      "bv": 235,
      "ev": 266
    },
    {
      "bv": 267,
      "ev": 298
    },
    {
      "bv": 299,
      "ev": 318
    },
    {
      "bv": 319,
      "ev": 336
    },
    {
      "bv": 337,
      "ev": 360
    },
    {
      "bv": 361,
      "ev": 381
    },
    {
      "bv": 382,
      "ev": 397
    },
    {
      "bv": 398,
      "ev": 424
    },
    {
      "bv": 425,
      "ev": 457
    },
    {
      "bv": 458,
      "ev": 495
    },
    {
      "bv": 496,
      "ev": 513
    },
    {
      "bv": 514,
      "ev": 547
    },
    {
      "bv": 548,
      "ev": 572
    },
    {
      "bv": 572,
      "ev": 591
    },
    {
      "bv": 592,
      "ev": 658
    },
    {
      "bv": 659,
      "ev": 692
    },
    {
      "bv": 693,
      "ev": 727
    },
    {
      "bv": 728,
      "ev": 773
    },
    {
      "bv": 774,
      "ev": 795
    },
    {
      "bv": 796,
      "ev": 830
    },
    {
      "bv": 831,
      "ev": 873
    },
    {
      "bv": 874,
      "ev": 927
    },
    {
      "bv": 928,
      "ev": 960
    },
    {
      "bv": 961,
      "ev": 980
    },
    {
      "bv": 981,
      "ev": 1011
    },
    {
      "bv": 1012,
      "ev": 1040
    },
    {
      "bv": 1041,
      "ev": 1083
    },
    {
      "bv": 1084,
      "ev": 1119
    },
    {
      "bv": 1120,
      "ev": 1149
    },
    {
      "bv": 1150,
      "ev": 1172
    },
    {
      "bv": 1173,
      "ev": 1195
    },
    {
      "bv": 1196,
      "ev": 1252
    },
    {
      "bv": 1253,
      "ev": 1290
    },
    {
      "bv": 1291,
      "ev": 1324
    },
    {
      "bv": 1325,
      "ev": 1358
    },
    {
      "bv": 1359,
      "ev": 1386
    },
    {
      "bv": 1387,
      "ev": 1420
    },
    {
      "bv": 1421,
      "ev": 1451
    },
    {
      "bv": 1452,
      "ev": 1473
    },
    {
      "bv": 1474,
      "ev": 1506
    },
    {
      "bv": 1507,
      "ev": 1532
    }
  ],
  [
    {
      "bv": 1533,
      "ev": 1554
    },
    {
      "bv": 1555,
      "ev": 1579
    },
    {
      "bv": 1580,
      "ev": 1601
    },
    {
      "bv": 1602,
      "ev": 1632
    },
    {
      "bv": 1633,
      "ev": 1655
    },
    {
      "bv": 1656,
      "ev": 1685
    },
    {
      "bv": 1686,
      "ev": 1714
    },
    {
      "bv": 1715,
      "ev": 1742
    },
    {
      "bv": 1743,
      "ev": 1777
    },
    {
      "bv": 1778,
      "ev": 1806
    },
    {
      "bv": 1807,
      "ev": 1816
    },
    {
      "bv": 1817,
      "ev": 1967
    },
    {
      "bv": 1868,
      "ev": 1989
    },
    {
      "bv": 1890,
      "ev": 1920
    },
    {
      "bv": 1921,
      "ev": 1947
    },
    {
      "bv": 1948,
      "ev": 1983
    },
    {
      "bv": 1984,
      "ev": 1999
    },
    {
      "bv": 2000,
      "ev": 2026
    },
    {
      "bv": 2027,
      "ev": 2051
    },
    {
      "bv": 2052,
      "ev": 2077
    },
    {
      "bv": 2078,
      "ev": 2114
    },
    {
      "bv": 2115,
      "ev": 2146
    },
    {
      "bv": 2145,
      "ev": 2177
    },
    {
      "bv": 2178,
      "ev": 2195
    },
    {
      "bv": 2196,
      "ev": 2235
    },
    {
      "bv": 2236,
      "ev": 2272
    },
    {
      "bv": 2273,
      "ev": 2293
    },
    {
      "bv": 2294,
      "ev": 2336
    },
    {
      "bv": 2337,
      "ev": 2382
    },
    {
      "bv": 2383,
      "ev": 2420
    },
    {
      "bv": 2421,
      "ev": 2438
    },
    {
      "bv": 2439,
      "ev": 2473
    },
    {
      "bv": 2474,
      "ev": 2496
    },
    {
      "bv": 2497,
      "ev": 2531
    },
    {
      "bv": 2532,
      "ev": 2566
    },
    {
      "bv": 2567,
      "ev": 2604
    },
    {
      "bv": 2605,
      "ev": 2633
    },
    {
      "bv": 2634,
      "ev": 2664
    },
    {
      "bv": 2665,
      "ev": 2707
    },
    {
      "bv": 2708,
      "ev": 2745
    }
  ]
]

I am trying to access specific elements knowing what the first two elements are: In this case 0,0 should return 0 and 47, with 1,0 returning 393 and 1298.

My problem is I'm not sure how to structure the lookup.

Here is what I have so far:

...
var myBeg: Int = 0
var myEnd: Int = 0
  
if let file = Bundle.main.path(forResource: "Blank", ofType: "json") {
   jsonData = try? Data(contentsOf: URL(fileURLWithPath: file))
   } else {
      print("Fail")
   }
   let jsonString = String(data: jsonData!, encoding: .utf8)
        
   let value = JSON(jsonData)
   let currentUserName = jsonData![0]
   for i in 0...value.count-1 {
      print("Element Value - \(value[oKey][oKey2]["bv"])")
   }
}

I know this has to be super simple, I'm just not getting it. I took a look at the samples in the swiftyJSON source but so far haven't come up with an answer.

Any help would be appreciative.


Solution

  • You could try a different approach to decoding your json data, using a Codable struct.

    Example code:

    struct TestEntry: Identifiable, Codable, Hashable {
        let id = UUID()
        let bv, ev: Int // <--- here, add ? if required
    
        enum CodingKeys: String, CodingKey {
            case bv, ev  // <--- here
        }
    }
    
    struct ContentView: View {
        @State private var entries: [[TestEntry]] = []
        
        var body: some View {
            List (entries, id: \.self) { entry in
                ForEach(entry) { test in
                    HStack {
                       Text("BV: \(test.bv)")
                       Text("EV: \(test.ev)")
                    }
                }
            }
            .onAppear {
                entries = getData()
            }
        }
    
        func getData() -> [[TestEntry]] {
            if let fileURL = Bundle.main.url(forResource: "Blank", withExtension: "json") {
                do {
                    let data = try Data(contentsOf: fileURL)
            //        print("---> data:\n \(String(data: data, encoding: .utf8) as AnyObject)")
                    let results = try JSONDecoder().decode([[TestEntry]].self, from: data)
            //        print("---> results: \(results)")
    
                    // for testing
                    for i in results.indices {
                        for j in results[i].indices {
                            print("---> results[\(i)][\(j)]: bv=\(results[i][j].bv)  ev=\(results[i][j].ev)")
                        }
                    }
    
                    return results
                } catch {
                    print(error)
                }
            }
            return []
        }
        
    }
    

    Note, your JSON data consist of an array of arrays of data.