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.
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.