как закодировать этот ответ JSON от Food API - PullRequest
0 голосов
/ 06 февраля 2019

Я получаю следующий ответ от вызова API.

Optional(<__NSSingleObjectArrayI 0x6000024638d0>(
{
    name = "";
    steps =     (
                {
            equipment =             (
                                {
                    id = 404667;
                    image = "dutch-oven.jpg";
                    name = "dutch oven";
                }
            );
            ingredients =             (
                                {
                    id = 2009;
                    image = "chili-powder.jpg";
                    name = "chili powder";
                },
                                {
                    id = 19334;
                    image = "dark-brown-sugar.png";
                    name = "brown sugar";
                },
                                {
                    id = 1065062;
                    image = "whole-chicken.jpg";
                    name = meat;
                }
            );
            length =             {
                number = 15;
                unit = minutes;
            };
            number = 1;
            step = "Heat 1 package (4 cups) Savory Meat base, thawed, in a Dutch oven over medium heat. Stir in 2 teaspoons chili powder and 1 teaspoon brown sugar. Cover and simmer, stirring occasionally, 15 to 20 minutes.";
             },
                     {
                 equipment =             (
                 );

Мне нужно извлечь подробный шаг и сохранить его, но я не могу разобрать этот ответ.кто-нибудь может помочь?вот код, который я пытаюсь использовать для сохранения этого шага:

let recipeSumaryJson : JSON = JSON(response.result.value!)
let step = recipeSumaryJson["steps"]["step"]

Ответы [ 4 ]

0 голосов
/ 06 мая 2019
import UIKit
import AFNetworking
import SDWebImage

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
{

    @IBOutlet var tbl_reload: UITableView!
    var getAllData = NSMutableArray()
    override func viewDidLoad()
    {
        super.viewDidLoad()
        CallApi()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func CallApi()
    {
        let manage = AFHTTPSessionManager()
        manage.get("https://smartfoodery.oneapp.ro/smart_food/public/api/get_restaurant/11", parameters: nil, progress: nil, success: { (Operation, response) in

            print(response!)
            if let data = response as? NSDictionary
            {
                let datas = data.value(forKey: "data") as! NSDictionary
                let restaurant_name = datas.value(forKey: "restaurant_name")
                self.title = "\(restaurant_name!)"

                let food_detail = datas.value(forKey: "food_detail") as! NSArray
                self.getAllData = NSMutableArray(array: food_detail)
                self.tbl_reload.reloadData()

            }

        }) { (Operation, Error) in
            print(Error.localizedDescription)
        }
    }

    //MARK:- Tableview Methods

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return getAllData.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let getData = getAllData.object(at: indexPath.row) as! NSDictionary
        let cell = tableView.dequeueReusableCell(withIdentifier: "displycell", for: indexPath) as! Customcell
        cell.lbl_name.text = (getData.value(forKey: "food_name") as! String)
        let food_image = getData.value(forKey: "food_image")
        cell.img_display.sd_setImage(with: URL(string: "\(food_image!)"), placeholderImage: UIImage(named: "placeholder.png"))
        cell.lbl_totalstock.text = "Total Stock : \(getData.value(forKey: "total_stock")!)"
        cell.lbl_foodprice.text = "Food Price :\(getData.value(forKey: "food_price")!)"
        cell.lbl_availabelstock.text = "Availabel Stock :\(getData.value(forKey: "available_stock")! )"
        cell.lbl_filtertype.text = "Filter Type : \(getData.value(forKey: "food_filter_type")!)"
        cell.lbl_availabelstock.font = UIFont(name: "Futura", size: 12)!
        cell.lbl_filtertype.font = UIFont(name: "Futura", size: 12)!
        cell.lbl_foodprice.font = UIFont(name: "Futura", size: 12)!
        cell.lbl_totalstock.font = UIFont(name: "Futura", size: 12)!
        return cell
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 160.5
    }

}
0 голосов
/ 06 февраля 2019

Сначала убедитесь, что полученные вами данные JSON верны, а затем вы можете преобразовать их в [String: Any] .После этого вы можете просто получить доступ к значению ключа.Это самый простой способ иметь дело с JSON.Есть еще один способ, который более уместен - использование Model для работы с JSON.

0 голосов
/ 06 мая 2019

// это программа вызова JSON Food API с большим количеством меток и многими другими.


import UIKit
import AFNetworking
import SDWebImage

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
{

    @IBOutlet var tbl_reload: UITableView!
    var getAllData = NSMutableArray()
    override func viewDidLoad()
    {
        super.viewDidLoad()
        CallApi()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func CallApi()
    {
        let manage = AFHTTPSessionManager()
        manage.get("https://smartfoodery.oneapp.ro/smart_food/public/api/get_restaurant/11", parameters: nil, progress: nil, success: { (Operation, response) in

            print(response!)
            if let data = response as? NSDictionary
            {
                let datas = data.value(forKey: "data") as! NSDictionary
                let restaurant_name = datas.value(forKey: "restaurant_name")
                self.title = "\(restaurant_name!)"

                let food_detail = datas.value(forKey: "food_detail") as! NSArray
                self.getAllData = NSMutableArray(array: food_detail)
                self.tbl_reload.reloadData()

            }

        }) { (Operation, Error) in
            print(Error.localizedDescription)
        }
    }

    //MARK:- Tableview Methods

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return getAllData.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let getData = getAllData.object(at: indexPath.row) as! NSDictionary
        let cell = tableView.dequeueReusableCell(withIdentifier: "displycell", for: indexPath) as! Customcell
        cell.lbl_name.text = (getData.value(forKey: "food_name") as! String)
        let food_image = getData.value(forKey: "food_image")
        cell.img_display.sd_setImage(with: URL(string: "\(food_image!)"), placeholderImage: UIImage(named: "placeholder.png"))
        cell.lbl_totalstock.text = "Total Stock : \(getData.value(forKey: "total_stock")!)"
        cell.lbl_foodprice.text = "Food Price :\(getData.value(forKey: "food_price")!)"
        cell.lbl_availabelstock.text = "Availabel Stock :\(getData.value(forKey: "available_stock")! )"
        cell.lbl_filtertype.text = "Filter Type : \(getData.value(forKey: "food_filter_type")!)"
        cell.lbl_availabelstock.font = UIFont(name: "Futura", size: 12)!
        cell.lbl_filtertype.font = UIFont(name: "Futura", size: 12)!
        cell.lbl_foodprice.font = UIFont(name: "Futura", size: 12)!
        cell.lbl_totalstock.font = UIFont(name: "Futura", size: 12)!
        return cell
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 160.5
    }

}


0 голосов
/ 06 февраля 2019

У вас есть какой-то ответ, и значение этого ответа, скорее всего, имеет тип Data, поэтому вам нужно декодировать его в некоторый тип Swift.


С Swift 4 выможет легко использовать протокол Decodable для декодирования Data в вашу пользовательскую модель, соответствующую этому протоколу.

Итак, давайте создадим простую структуру для простого json

Json:

let data = Data("""
{
    "property": "someName"
}
""".utf8)

Модель:

struct Model: Decodable {
    let property: String
}

Каждое свойство также должно быть Decodable, поэтому, если у вас есть другая декодируемая структура, вы можете использовать ее как тип свойства и даже использовать его для массиваэтот тип, или, например, некоторый словарь

Json:

let data = Data("""
{
    "items": [
        { "title": "name1" },
        { "title": "name2" },
        { "title": "name3" }
    ]
}
""".utf8)

Модель:

struct Model: Decodable {
    let items: [Item]
}

struct Item: Decodable {
    let title: String
}

Вы видите этот шаблон?Поэтому попробуйте реализовать это в вашем случае самостоятельно.


Теперь последняя часть: декодирование.Для декодирования Data вы можете просто использовать JSONDecoder и метод decode.Просто укажите тип вывода и передайте Data object

Обратите внимание, что декодирование может вызвать ошибку, поэтому вы должны поместить его в блок do-try-catch

guard let data = response.result.value else { ... }

do {
    response.result.value!
    let models = try JSONDecoder().decode([Model].self, from: data)
} catch { print(error) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...