Ios 如何解析此JSON并为其创建结构
我有一个JSON:Ios 如何解析此JSON并为其创建结构,ios,json,swift,Ios,Json,Swift,我有一个JSON: [ { "Men": { "image": "/url.png", "Jeans": [ { "name": "asd", "about": "sadvc", "image": "/urls.sjd" }, { "name": "asd", "about": "sadvc", "image": "/urls.sjd"
[
{
"Men": {
"image": "/url.png",
"Jeans": [
{
"name": "asd",
"about": "sadvc",
"image": "/urls.sjd"
},
{
"name": "asd",
"about": "sadvc",
"image": "/urls.sjd"
},
{
"name": "asd",
"about": "sadvc",
"image": "/urls.sjd"
}
]
},
"Women": {
"image": "/url2.jpeg",
"All": {}
}
}
]
如何创建“逐步”进入tableview的结构
第一种观点——改变性别——女性还是男性。
第二种-改变类型-牛仔裤或其他。。。
干渴-牛仔裤系列视图(名称、关于和价格)
现在,我有了struct
struct Clothe: Decodable {
let about: String
let name: String
let image: String
}
和func用于下载JSON
var clothes = [Clothe]()
public func downloadJSON(completed: @escaping () -> ()) {
let url = URL(string: "https...bla-bla/ULRhere.json")
let request = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 120.0)
URLSession.shared.dataTask(with: request) { (data, response, error) in
if error == nil {
do {
self.clothes = try JSONDecoder().decode([Clothe].self, from: data!)
print(self.clothes)
DispatchQueue.main.async {
completed()
}
} catch {
print("JSON Error")
}
}
}.resume()
}
让json=“”{“男性”:“{“图像”:“/url.png”,“牛仔裤”:[{“名称”:“asd”,“关于”:“sadvc”,“图像”:“/url.sjd”},{“名称”:“asd”,“关于”:“sadvc”,“图像”:“/url.sjd”},{“名称”:“asd”,“关于”:“sadvc”,“图像”:“/url2.jpeg”,“所有”:“{}}}”数据(使用:.utf8)
布匹(男士:可选)(图片:可选(“/url.png”)、牛仔裤:可选(姓名:可选(“asd”)、关于:可选(“sadvc”)、图片:可选(/urls.sjd”)、JeansStruct(姓名:可选(“sadvc”)、JeansStruct(姓名:可选(“asd”)、关于:可选(“sadvc”)、图片:可选(/urls.sjd”)、JeansStruct(姓名:可选(“asd”),关于:可选(“sadvc”)、图像:可选(“url.sjd”))))))、女性:可选(uu lldb_expr_88.WomanStruct(图像:可选(/url2.jpeg”)))这不是一个好的JSON设计。我建议不要使用数据值(“男性”和“女性”或“牛仔裤”与其他类型的服装)作为字典的键 此外,我建议web服务的响应返回一个字典,其中包含键,如
success
值(指示结果是否成功的布尔值)和result
键(用于响应的内容)。这样,如果出现错误,响应的基本结构将是相同的(但成功的响应将包括结果
键,失败可能包括错误消息或错误代码)
不管怎样,我建议如下:
{
"success": true,
"result": [{
"name": "Men",
"image": "men.png",
"productLine": [{
"name": "Jeans",
"image": "jeans.png",
"products": [{
"name": "Slim fit",
"about": "Slim Fit Jeans",
"image": "slim.png"
},
{
"name": "Bell Bottom",
"about": "Cool bell bottom jeans",
"image": "bellbottom.png"
},
{
"name": "Acid Wash",
"about": "Acid wash jeans",
"image": "acid.png"
}
]
}]
}, {
"name": "Women",
"image": "women.jpeg"
}]
}
然后可以设置逻辑模型实体:
struct Product: Codable {
let about: String
let name: String
let image: String
}
struct ProductLine: Codable {
let name: String
let image: String
let products: [Product]?
}
struct CustomerCategory: Codable {
let name: String
let image: String
let productLine: [ProductLine]?
}
然后,您将按照如下方式处理响应:
func processResponse(_ data: Data) {
struct ResponseObject: Codable {
let success: Bool
let errorCode: Int?
let result: [CustomerCategory]?
}
do {
let responseObject = try JSONDecoder().decode(ResponseObject.self, from: data)
guard responseObject.success, let customerCategories = responseObject.result else {
// handle server error here
return
}
print(customerCategories)
} catch {
print(error)
}
}
这允许您添加新的客户类别(如儿童)或产品线(如牛仔裤以外的物品),而不会影响与服务器的基本接口
在您的中,您已经更改了返回数据的性质,但我还是建议不要将数据属性放在字典的键中。如果要使用此结构,其中键名是任意值(例如“牛仔裤”与“衬衫”与“时髦夹克”等),您可能希望使用
JSONSerialization
并手动导航它。或者,如果您愿意,我们可以建议更好的JSON结构,它将更适合Codable
类型。
func processResponse(_ data: Data) {
struct ResponseObject: Codable {
let success: Bool
let errorCode: Int?
let result: [CustomerCategory]?
}
do {
let responseObject = try JSONDecoder().decode(ResponseObject.self, from: data)
guard responseObject.success, let customerCategories = responseObject.result else {
// handle server error here
return
}
print(customerCategories)
} catch {
print(error)
}
}