Json respon: "hasil": { "user_images": [ { "id": 113, "user_id": "160", "image": "...

0
iosswift 5 April 2021, 17:44

2 jawaban

Jawaban Terbaik

Sol 1

if let code = response.dict?["result"] as? [String : Any]  {
  if let userImages = code["user_images"] as? [[String : Any]] {
      for item in userImages {
         print(item["image_title"])
      } 
   } 
}

Sol 2

if let code = response.dict?["result"] as? [String : Any]  { 
   do { 
       let data = try JSONSerialization.data(withJSONObject: code) 
       let decoder = JSONDecoder() 
       decoder.keyDecodingStrategy = .convertFromSnakeCase 
       let res = try decoder.decode(Result.self, from: data) 
       let titles = res.userImages.map { $0.imageTitle } 
       print(titles) 
   }
   catch {
       print(error)
   } 
}

// MARK: - Result
struct Result: Codable {
    let userImages: [UserImage]
 
} 
// MARK: - UserImage
struct UserImage: Codable {
    let id: Int
    let userId, image, imageTitle: String
}
2
Sh_Khan 5 April 2021, 15:13

Kode dari @Sh_Khan

if let code = response.dict?["result"] as? [String : Any]  {
  //You're using "as?" which means you're casting as an optional type. 
  //One simple solution to this is here where it's unwrapped using "if let"
  if let userImages = code["user_images"] as? [[String : Any]] {
      // [String:Any] is a Dictionary
      // [[String:Any]] is an Array of Dictionary
      for item in userImages {
         print(item["image_title"])
      } 
   } else {
      // We didn't unwrap this safely at all, do something else. 
}

Mari selami ini sedikit. Struktur ini adalah Objek JSON

    {
        "id": 113,
        "user_id": "160",
        "image": "1617349564.jpg",
        "image_title": "33"
    }

Tapi itu hanya objek JSON ketika berdiri sendiri. Menambahkan kunci, atau dalam contoh ini user_images menjadikannya kamus. Perhatikan bahwa [ tidak melilitnya. Artinya itu kamus mandiri. Jika ini adalah objek Anda, dan ini saja, kode asli Anda akan berfungsi, tetapi Anda berurusan dengan Array dari Dictionaries.

"user_images":
    {
        "id": 113,
        "user_id": "160",
        "image": "1617349564.jpg",
        "image_title": "33"
    }

Baris kode ini pada dasarnya berarti bahwa Anda mengharapkan untuk mendapatkan kembali Array dari Dictionary tersebut. Ingatlah, setiap nilai untuk kamus bukanlah nilai larik, itulah sebabnya Anda tidak melihat sesuatu seperti ini [[[String: Any]]] karena data tidak bersarang seperti itu.

if let userImages = code["user_images"] as? [[String : Any]]

Apa ini tentang opsional?

Opsional pada dasarnya adalah nilai kemungkinan nil yang dapat dikembalikan. Biasanya saat bekerja dengan JSON, Anda tidak dapat menjamin bahwa Anda akan selalu menerima nilai untuk kunci yang diberikan. Bahkan mungkin saja pasangan nilai kunci benar-benar hilang. Jika itu terjadi, Anda akan berakhir dengan crash, karena tidak ditangani. Berikut adalah cara paling umum untuk menangani Optionals

var someString: String? //This is the optional one
var someOtherString = "Hello, World!" //Non-optional

if let unwrappedString1 = someString {
   //This code will never be reached
} else {
   //This code will, because it can't be unwrapped.
}

guard let unwrappedString2 = someString else {
   //This code block will run
   return //Could also be continue, break, or return someValue
} 

//The code will never make it here.
print(someOtherString)

Selanjutnya, Anda dapat bekerja dengan opsional dengan membuka bungkusnya yang merupakan fitur bagus.

var someString: String?
var someInt: Int?
var someBool: Bool?

someString = "Hello, World!"

//someString is not nil, but an important distinction to make, if any
//fail, ALL fail.
if let safeString = someString,
   let safeInt = someInt,
   let safeBool = someBool {
      //If the values are unwrapped safely, they will be accessible here.
      //In this case, they are nil, so this block will never be hit.
      //I make this point because of scope, the guard statement saves you from the 
      //scoping issue present in if let unwrapping.
      print(safeString)
      print(safeInt)
      print(safeBool)
}

guard let safeString = someString,
      let safeInt = someInt, 
      let safeBool = someBool {
         //This will be hit if a value is null
      return
}

//However notice the scope is available outside of the guard statement, 
//meaning you can safely use the values now without them being contained
//to an if statement. Despite this example, they would never be hit.
print(safeString)
print(safeInt)
print(safeBool)
0
xTwisteDx 5 April 2021, 15:24