parsing complex JSON to UITableView And UICollectionView

帅比萌擦擦* 提交于 2019-12-25 17:43:47

问题


i am creating swift app and i want to parse JSON but first let me show you my UI

i have One UITableview inside tableview cell i have UICollectionView and below is the screen shot of my UserInterface

And here is my JSON which i have to parse

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

now i will show you what i have done to achieve this but not work for me

So for that i have create Model Class Like below

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

Now Collection view is in tableview cell so i have call api in UITableview Cell like below

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)
            }
        })
    }

but not understand how to parse in collection view which is inside jigyasa array which is in JSON can any one please tell me how parse inside array data to collectionview

i just mean that i want to display data in collectionview from jigyasa array from json


回答1:


Here, I am going to parse your JSON using SwiftyJSON. Change your jigyasaCatList() like this:

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)
        }
    })
}

To load an image from external resource like Api you can use CocoaPods like KingFisher or SDWebImage. Here I use KingFisher.

Follow the code below to show image in 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
    }
}



来源:https://stackoverflow.com/questions/58988296/parsing-complex-json-to-uitableview-and-uicollectionview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!