codeNinjaBro
codeNinjaBro

Reputation: 78

swift3 parsing with model issue

Hello I am trying to parse through this json file: http://pastebin.com/TCdkJnvZ

Here is the class I made of the information I want to parse out:

public class Recipe: NSObject {

  var recipeID : NSNumber?
  var categoryName : String?
  var ingredients : [Int : Ingredients]?
  var nutrition : [Nutrition]?
  var imageName : String?
  var instructions : [Int : String]?

}

class Ingredients : NSObject {

   var id : NSNumber?
   var name : String?
   var quantity: NSNumber?
   var unit : String?

}

class  Nutrition : NSObject {

  var serving : String?
  var calories : NSNumber?
  var fat : String?
  var carbs : NSNumber?

 }

This image is the current issue.. I am really not sure what I am doing wrong here.. so if I can get any help on fixing my logic/issue it would be appreciated.

 func parseToJSON(data: Any) {

    // add meals to here
    var recipes : [Recipe]
    // single meals here
    var meals : Recipe

    do {

        if let json = try JSONSerialization.jsonObject(with: data as! Data) as? [String: Any],
        meals.recipeID == json["recipeID"] as! NSNumber? ,
        meals.imageName == json["ImageURL"] as! String?,
        //meals.instructions == meals.parseInstructions(instructions: (json["Instructions"] as! String)),
        meals.categoryName == "Meals" ,

        let ingredients = json["Ingredients"] as! [[String: Any]]? {

                for items in ingredients {
                    var i : Int = 0
                    var groceryItems : Ingredients

                    groceryItems.id = items["IngredientID"] as? NSNumber
                    groceryItems.name = items["Name"] as? String
                    groceryItems.quantity = items["Quantity"] as? NSNumber
                    groceryItems.unit = items["Unit"] as? String

                    meals.ingredients?[i] = groceryItems
                }
            };

        let nutritionInfo = json["NutritionInfo"] as! [[String: Any]]? {

                for items in nutritionInfo {

                    var nutrition : Nutrition

                    nutrition.serving = items["SingularYieldUnit"] as? String
                    nutrition.calories = items["TotalCalories"] as? NSNumber
                    nutrition.fat = items["TotalFat"] as? String
                    nutrition.carbs = items["TotalCarbs"] as NSNumber

                    meals.nutrition = nutrition
                }
        };
    }
    catch{

    }

}

Upvotes: 0

Views: 44

Answers (1)

nathangitter
nathangitter

Reputation: 9777

It looks like you have a variety of syntax errors, but the compiler can only show one issue at a time. I've cleaned up the code slightly for you, which should push you in the right direction. I can't completely fix it because I don't know what your exact intentions are.

Here is the updated parseToJSON function:

func parseToJSON(data: Any) {

    let meals = Recipe()

    do {

        if let json = try JSONSerialization.jsonObject(with: data as! Data) as? [String: Any] {

            meals.recipeID == json["recipeID"] as! NSNumber?
            meals.imageName == json["ImageURL"] as! String?
            //meals.instructions == meals.parseInstructions(instructions: (json["Instructions"] as! String)),
            meals.categoryName == "Meals"

            if let ingredients = json["Ingredients"] as! [[String: Any]]? {
                for items in ingredients {
                    let groceryItems = Ingredients()
                    groceryItems.id = items["IngredientID"] as? NSNumber
                    groceryItems.name = items["Name"] as? String
                    groceryItems.quantity = items["Quantity"] as? NSNumber
                    groceryItems.unit = items["Unit"] as? String
                    meals.ingredients?.append(groceryItems)
                }
            }

            if let nutritionInfo = json["NutritionInfo"] as! [[String: Any]]? {
                for items in nutritionInfo {
                    let nutrition = Nutrition()
                    nutrition.serving = items["SingularYieldUnit"] as? String
                    nutrition.calories = items["TotalCalories"] as? NSNumber
                    nutrition.fat = items["TotalFat"] as? String
                    nutrition.carbs = items["TotalCarbs"] as? NSNumber
                    meals.nutrition?.append(nutrition)
                }
            }

        }

    }
    catch{

    }

}

I also changed the Recipe object's ingredients property to:

var ingredients : [Ingredients]?

The main issue was that a lot of your code was inside of an if let expression and your indentation was off so you couldn't as easily tell.

Upvotes: 1

Related Questions