【问题标题】:parsing complex JSON to UITableView And UICollectionView将复杂的 JSON 解析为 UITableView 和 UICollectionView
【发布时间】:2020-03-18 04:11:57
【问题描述】:

我正在创建 swift 应用程序,我想解析 JSON 但首先让我向您展示我的 UI

我在 tableview 单元格中有一个 UITableview 我有 UICollectionView,下面是我的 UserInterface 的屏幕截图

这是我必须解析的JSON

{
  "jigyasa_category_list": [
    {
      "status": "1",
      "updated_date": "2019-11-18 17:02:37",
      "created_date": "2019-08-28 16:32:22",
      "jigyasa_category_image_id": "4",
      "jigyasa_sanskrit": "jigyasa cate sanskrit 2",
      "jig_cate_id": "7",
      "jigyasa": [
        {
          "image1": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/purple_1.png",
          "name_english": "",
          "image5": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/purple_5.png",
          "name_sanskrit": "",
          "images": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/purple_1.png",
          "image2": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/purple_2.png",
          "name_hindi": "gfdgfd",
          "image4": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/purple_4.png",
          "image3": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/purple_3.png",
          "jigyasa_id": "8"
        }
      ],
      "updated_by": "2",
      "created_by": "2",
      "jigyasa_hindi": "jigyasa cate hindi 1",
      "jigyasa_english": "jigyasa cate english 3"
    },
    {
      "status": "1",
      "updated_date": "2019-11-13 16:28:43",
      "created_date": "2019-08-29 15:07:53",
      "jigyasa_category_image_id": "2",
      "jigyasa_sanskrit": "dfgh",
      "jig_cate_id": "11",
      "jigyasa": [
        {
          "image3": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_3.png",
          "jigyasa_id": "5",
          "image5": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_5.png",
          "name_sanskrit": "n,n,",
          "name_english": "n,n,",
          "images": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_1.png",
          "image2": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_2.png",
          "image1": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_1.png",
          "image4": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_4.png",
          "name_hindi": "n,n,"
        },
        {
          "image3": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_3.png",
          "jigyasa_id": "7",
          "image5": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_5.png",
          "name_sanskrit": "",
          "name_english": "",
          "images": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_2.png",
          "image2": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_2.png",
          "image1": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_1.png",
          "image4": "http:\/\/192.168.1.115\/swadhyay\/assets\/uploads\/jigyasa_category_boxes\/green_4.png",
          "name_hindi": "sadsa"
        }
      ],
      "updated_by": "0",
      "created_by": "2",
      "jigyasa_hindi": "fcgh",
      "jigyasa_english": "dfh"
    },
    {
      "created_date": "2019-10-11 17:07:09",
      "updated_date": "2019-10-11 17:10:04",
      "jigyasa_hindi": "hindi",
      "jig_cate_id": "14",
      "jigyasa_english": "english",
      "created_by": "2",
      "jigyasa_category_image_id": "2",
      "updated_by": "2",
      "status": "1",
      "jigyasa_sanskrit": "sanskrit",
      "jigyasa": [

      ]
    },
    {
      "created_date": "2019-11-04 10:48:06",
      "updated_date": "2019-11-04 10:48:06",
      "jigyasa_hindi": "hfgh",
      "jig_cate_id": "15",
      "jigyasa_english": "fghfg",
      "created_by": "2",
      "jigyasa_category_image_id": "2",
      "updated_by": "0",
      "status": "1",
      "jigyasa_sanskrit": "gfhfgh",
      "jigyasa": [

      ]
    }
  ],
  "message": "Jigyasa Category",
  "success": "1"
}

现在我将向您展示我为实现这一目标所做的工作,但对我不起作用

为此,我创建了如下所示的模型类

struct Jigyasa_category_list : Codable {
    let jigyasa_english : String?
    let jigyasa_hindi : String?
    let jigyasa_sanskrit : String?
    let jigyasa : [Jigyasa]?

    init(jigyasa_english: String?,jigyasa_hindi: String?,jigyasa_sanskrit: String,jigyasa: [Jigyasa]?) {
        self.jigyasa_english = jigyasa_english
        self.jigyasa_hindi = jigyasa_hindi
        self.jigyasa_sanskrit = jigyasa_sanskrit
        self.jigyasa = jigyasa
    }
}

struct Jigyasa : Codable {
    let image3 : String?
    let image1 : String?
    let name_english : String?
    let images : String?
    let name_hindi : String?
    let jigyasa_id : String?
    let image5 : String?
    let image4 : String?
    let name_sanskrit : String?
    let image2 : String?

    init(image3: String?,image1: String?,name_english: String,images: String?,name_hindi: String?,jigyasa_id: String?,image5: String?,image4: String?,name_sanskrit: String?,image2: String?) {
        self.image3 = image3
        self.image1 = image1
        self.name_english = name_english
        self.images = images
        self.name_hindi = name_hindi
        self.jigyasa_id = jigyasa_id
        self.image5 = image5
        self.image4 = image4
        self.name_sanskrit = name_sanskrit
        self.image2 = image2
    }
}

现在集合视图在 tableview 单元格中,所以我在 UITableview 单元格中调用 api,如下所示

var jigyasaData = [Jigyasa_category_list]()
func jigyasaCatList(){
        let preferences = UserDefaults.standard
        let uid = "u_id"
        let acTkn = "acc_tkn"

        let u_ID = preferences.object(forKey: uid)
        let A_Token = preferences.object(forKey: acTkn)

        let params = ["user_id": u_ID!, "access_token": A_Token!]
        print(params)
        Alamofire.request(apijigyasacategorylist, method: .post, parameters: params).responseJSON(completionHandler: {(response) in
            switch response.result{
            case.success(let value):
                let json  = JSON(value)
                print(json)
                let data = json["jigyasa_category_list"]
                if data == []{

                }else{
                    data.array?.forEach({ (jList) in
                        let j_list = Jigyasa_category_list(jigyasa_english: jList["jigyasa_english"].stringValue, jigyasa_hindi: jList["jigyasa_hindi"].stringValue, jigyasa_sanskrit: jList["jigyasa_sanskrit"].stringValue, jigyasa: jList["jigyasa"].arrayObject as? [Jigyasa])
                        self.jigyasaData.append(j_list)
                    })
                }
                self.collView.reloadData()
            case.failure(let error):
                print(error.localizedDescription)
            }
        })
    }

但不明白如何在 JSON 中 jigyasa 数组中的集合视图中解析,谁能告诉我如何将数组中的数据解析到集合视图中

我的意思是我想在来自 json 的 jigyasa 数组的 collectionview 中显示数据

【问题讨论】:

  • 你使用 SwiftyJSON 来解析 JSON 数据吗?
  • 是的,我用过SwiftyJSON
  • app.quicktype.io 过去你的 json
  • 再见 struct Welcom
  • 即使你不需要任何库来解析(SwiftyJSON)

标签: ios json swift uitableview uicollectionview


【解决方案1】:

在这里,我将使用 SwiftyJSON 解析您的 JSON。像这样更改您的jigyasaCatList()

var jigyasaData = [Jigyasa_category_list]()

func jigyasaCatList(){
    let preferences = UserDefaults.standard
    let uid = "u_id"
    let acTkn = "acc_tkn"

    let u_ID = preferences.object(forKey: uid)
    let A_Token = preferences.object(forKey: acTkn)

    let params = ["user_id": u_ID!, "access_token": A_Token!]
    print(params)
    Alamofire.request(apijigyasacategorylist, method: .post, parameters: params).responseJSON(completionHandler: {(response) in
        switch response.result{
        case.success(let value):
            let json  = JSON(value)
            print(json)
            let jigyasaCategoryList = json["jigyasa_category_list"].arrayValue.map({ (data) -> Jigyasa_category_list in

                let jigyasa_english = data["jigyasa_english"].stringValue
                let jigyasa_hindi = data["jigyasa_hindi"].intValue
                let jigyasa_sanskrit = data["jigyasa_sanskrit"].stringValue

                let jigyasa = data["jigyasa"].arrayValue.map({ (jigyasa_data) -> Jigyasa in
                    let image3 = jigyasa_data["image3"].stringValue
                    let image1 = jigyasa_data["image1"].stringValue
                    let name_english = jigyasa_data["name_english"].intValue
                    let images = jigyasa_data["images"].stringValue
                    let name_hindi = jigyasa_data["name_hindi"].stringValue
                    let jigyasa_id = jigyasa_data["jigyasa_id"].stringValue
                    let image5 = jigyasa_data["image5"].stringValue
                    let image4 = jigyasa_data["image4"].stringValue
                    let name_sanskrit = jigyasa_data["name_sanskrit"].stringValue
                    let image2 = jigyasa_data["image2"].stringValue

                    return Jigyasa(image3: image3, image1: image1, name_english: name_english, images: images, name_hindi: name_hindi, jigyasa_id: jigyasa_id, image5: image5, image4: image4, name_sanskrit: name_sanskrit, image2: image2)
                })

                return Jigyasa_category_list(jigyasa_english: jigyasa_english, jigyasa_hindi: jigyasa_hindi, jigyasa_sanskrit: jigyasa_sanskrit, jigyasa: jigyasa)
            })

            if jigyasaCategoryList.count > 0 {
                self.jigyasaData = jigyasaCategoryList
            }

//            if data == []{
//
//            }else{
//                data.array?.forEach({ (jList) in
//                    let j_list = Jigyasa_category_list(jigyasa_english: jList["jigyasa_english"].stringValue, jigyasa_hindi: jList["jigyasa_hindi"].stringValue, jigyasa_sanskrit: jList["jigyasa_sanskrit"].stringValue, jigyasa: jList["jigyasa"].arrayObject as? [Jigyasa])
//                    self.jigyasaData.append(j_list)
//                })
//            }
            self.collView.reloadData()
        case.failure(let error):
            print(error.localizedDescription)
        }
    })
}

要从 Api 等外部资源加载图像,您可以使用 CocoaPods,如 KingFisherSDWebImage。这里我使用 KingFisher

按照下面的代码在 UICollectionViewCell 中显示图像。

struct CustomCellData {
    var title: String
    var image: String
}

class CustomCell: UICollectionViewCell {


    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var cellImageView: UIImageView!

    var data: CustomCellData? {
        didSet {

            guard let data = data else {return}

            titleLabel.text = data.title

            let imageName = data.image.replacingOccurrences(of: " ", with: "%20")

            cellImageView.kf.indicatorType = .activity
            cellImageView.kf.setImage(with: URL(string: imageName), placeholder: nil, options: [
                .scaleFactor(UIScreen.main.scale),
                .transition(.fade(1)),
                .cacheOriginalImage
                ], progressBlock: nil, completionHandler: nil)
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        cellImageView.clipsToBounds = true
    }
}

【讨论】:

  • 你能告诉我如何明智地在集合视图部分中填充吗?
  • tableViewCell 中的collectionView 有轮播行为吗?
  • collectionView 没有轮播行为但有水平滚动
  • 是的,我知道了,但问题是图像未按部分设置
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多