问题
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