Ios 如何解析此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"

我有一个JSON:

[
{
  "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)
    }
}