解析json文件:
创建 .json文件:选择swift file->文件名填写xx.json->弹出提示选择use .json
内容格式如下:
[
{ "id":1,
"name": "lambo1",
"age": 100,
"imageName":"center"
},
{ "id":2,
"name": "lambo2",
"age": 1,
"imageName":"center"
}
]
解析json:
Landmark.swift文件内容
import Foundation
import SwiftUI
struct Landmark: Hashable, Codable {
var id: Int
var name: String
var age: Int
private var imageName: String
var image: Image {
Image(imageName)
}
}
解析
var landmarks: [Landmark] = load("landmarkData.json")
func load<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
do {
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
解析json字符串:普通json字符串,没有嵌套
解析
var landmarks: [Landmark] = loadjsonstr()
func loadjsonstr<T:Decodable>()->T{
let jsonStr = "[{\"id\": 1, \"age\": 100,\"imageName\": \"center\", \"name\": \"name1\"}, {\"id\": 2,\"age\": 1,\"imageName\": \"center\",\"name\":\"name2\"}]"
if let jsonData = jsonStr.data(using: String.Encoding.utf8, allowLossyConversion: false) {
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: jsonData)
} catch {
fatalError("Couldn't parse \(T.self):\n\(error)")
}
}
return [:] as! T
}
解析json字符串:普通json字符串,有嵌套
一级:
import Foundation
import SwiftUI
struct Landmark: Hashable, Codable {
var id: Int
var name:[Name]
var age: Int
private var imageName: String
var image: Image {
Image(imageName)
}
}
二级
import SwiftUI
struct Name:Hashable, Codable {
var name:String
}
解析
var landmarks: [Landmark] = loadjsonstr()
func loadjsonstr<T:Decodable>()->T{
let jsonStr = "[{\"id\": 1, \"age\": 100,\"imageName\": \"center\", \"name\": [{\"name\": \"公司\",\"number\": \"123456\"}, {\"name\": \"家庭\"}]}, {\"id\": 2,\"age\": 1,\"imageName\": \"center\",\"name\": [{ \"name\": \"公司\"}]}]"
if let jsonData = jsonStr.data(using: String.Encoding.utf8, allowLossyConversion: false) {
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: jsonData)
} catch {
fatalError("Couldn't parse \(T.self):\n\(error)")
}
}
return [:] as! T
}
调用:landmark.name[0].name