[英]Swift Parse JSON As Array
我一直在使用 swift 應用程序。 我堅持將多個數據解析為數組,這是我的 json
{
"error":0,
"success":1,
"kode_keranjang":"2",
"kode_produk":"1",
"kode_pelanggan":"USR-6cs42",
"jumlah":"1",
"nama_produk":"MacBook 2015",
"gambar":"MacBook.jpg",
"harga":"2000000",
"message":"Berhasil"
}
{
"error":0,
"success":1,
"kode_keranjang":"3",
"kode_produk":"2",
"kode_pelanggan":"USR-6cs42",
"jumlah":"1",
"nama_produk":"iPhone 6s",
"gambar":"iPhone",
"harga":"12000000",
"message":"Berhasil"
}
我怎樣才能快速獲得 nama_produk 作為數組? 所以我可以在我的 tableview 單元格中填充它
這是我的 swift
let myUrl = NSURL(string: "http://xxxxxxxx.com/produk.php");
let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "POST";// Compose a query string
let postString = "produkid="+produkid!+"&kat="+kat!+"";
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil
{
print("error=\(error)")
return
}
// You can print out response object
print("response = \(response)")
// Print out response body
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")
//Let's convert response sent from a server side script to a NSDictionary object:
do {
let myJSON = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
if let parseJSON = myJSON {
// Now we can access value of First Name by its key
let nama_produk = parseJSON["nama_produk"] as? NSArray
let status = parseJSON["success"] as? Int
if(status == 1){
print (nama_produk);
}
else{
// let statusnya = "error";
return;
}
}
} catch {
print(error)
}
}
task.resume()
在這一行
let nama_produk = parseJSON["nama_produk"] as? NSArray
print (nama_produk);
我將 nama_produk 創建為數組,然后嘗試打印它,但它是空的,不顯示數據。
然后我想像這樣在我的單元格中添加 nama_produk 數組
var nama_produk_array = [""+nama_produk+""]
cell.namaproduk.text = nama_produk_array[indexPath.row]
我如何將 json 解析為數組?
請某人
據我所知,您有一個字典數組,並希望將nama_produk
字段提取到該數組中。 這是在Swift 3, Xcode 8 中執行此操作的安全方法:
var jsonString1 =
"{\"error\":0,\"success\":1,\"kode_keranjang\":\"2\",\"kode_produk\":\"1\",\"kode_pelanggan\":\"USR-6cs42\",\"jumlah\":\"1\",\"nama_produk\":\"MacBook 2015\",\"gambar\":\"MacBook.jpg\",\"harga\":\"2000000\",\"message\":\"Berhasil\"}"
var jsonString2 =
"{\"error\":0,\"success\":1,\"kode_keranjang\":\"3\",\"kode_produk\":\"2\",\"kode_pelanggan\":\"USR-6cs42\",\"jumlah\":\"1\",\"nama_produk\":\"iPhone 6s\",\"gambar\":\"iPhone\",\"harga\":\"12000000\",\"message\":\"Berhasil\"}"
var jsonString = "[" + jsonString1 + "," + jsonString2 + "]"
var data = jsonString.data(using: .utf8)!
do {
if let json = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]
{
let array = json
.filter{ $0["success"] as? Int == 1}
.flatMap{$0["nama_produk"] as? String}
print(array) // ==> ["MacBook 2015", "iPhone 6s"]
} else {
print("bad json")
}
} catch let error as NSError {
print(error)
}
jsonString
是可能的 json => 2 個字典jsonString1
和jsonString2
的數組
flatMap
負責處理$0["nama_produk"]
到String
的失敗轉換,這可能會不必要地隱藏您收到的 json 問題,因此您可以考慮使用.map{ $0["nama_produk"] as! String }
.map{ $0["nama_produk"] as! String }
正如亞歷山大建議的那樣
您提供的不是有效的 JSON。 您必須有一個單一的頂級元素。 也許你想把它放在一個數組中,像這樣:
[
{
"error": 0,
"success": 1,
"kode_keranjang": "2",
"kode_produk": "1",
"kode_pelanggan": "USR-6cs42",
"jumlah": "1",
"nama_produk": "MacBook 2015",
"gambar": "MacBook.jpg",
"harga": "2000000",
"message": "Berhasil"
} {
"error": 0,
"success": 1,
"kode_keranjang": "3",
"kode_produk": "2",
"kode_pelanggan": "USR-6cs42",
"jumlah": "1",
"nama_produk": "iPhone 6s",
"gambar": "iPhone",
"harga": "12000000",
"message": "Berhasil"
}
]
import Foundation
var jsonFragment1 =
"{\"error\":0,\"success\":1,\"kode_keranjang\":\"2\",\"kode_produk\":\"1\",\"kode_pelanggan\":\"USR-6cs42\",\"jumlah\":\"1\",\"nama_produk\":\"MacBook 2015\",\"gambar\":\"MacBook.jpg\",\"harga\":\"2000000\",\"message\":\"Berhasil\"}"
var jsonFragment2 =
"{\"error\":0,\"success\":1,\"kode_keranjang\":\"3\",\"kode_produk\":\"2\",\"kode_pelanggan\":\"USR-6cs42\",\"jumlah\":\"1\",\"nama_produk\":\"iPhone 6s\",\"gambar\":\"iPhone\",\"harga\":\"12000000\",\"message\":\"Berhasil\"}"
var jsonString = "[" + jsonFragment1 + "," + jsonFragment2 + "]"
func parse(JSON json: String) throws -> [String]? {
guard let data = json.data(using: .utf8) else { return nil }
guard let rootArray = try JSONSerialization.jsonObject(with: data, options : []) as? [[String: Any]]
else { return nil }
return rootArray
.filter{ $0["success"] as? Int == 1}
.map{ $0["nama_produk"] as! String }
}
if let devices = try parse(JSON: jsonString) {
print(devices)
}
else {
print("error parsing the json")
}
你可以在這里試試。
struct Product: Decodable {
let namaProduk: String?
}
let JSON: String = """
[{
"error": 0,
"success": 1,
"kode_keranjang": "2",
"kode_produk": "1",
"kode_pelanggan": "USR-6cs42",
"jumlah": "1",
"nama_produk": "MacBook 2015",
"gambar": "MacBook.jpg",
"harga": "2000000",
"message": "Berhasil"
},
{
"error": 0,
"success": 1,
"kode_keranjang": "3",
"kode_produk": "2",
"kode_pelanggan": "USR-6cs42",
"jumlah": "1",
"nama_produk": "iPhone 6s",
"gambar": "iPhone",
"harga": "12000000",
"message": "Berhasil"
}]
"""
if let jsonData = JSON.data(using: .utf8) {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let products: [Product] = try decoder.decode([Product].self, from: jsonData)
let namaProduks: [String] = products.compactMap { $0.namaProduk }
print(namaProduks) // ["MacBook 2015", "iPhone 6s"]
} catch {
print(error) // handle the error
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.