如何定义数组数组?

时间:2022-07-26 22:28:37

I am trying to fetch the Json data from Api which is in the following format

我正在尝试从Api中获取Json数据,它的格式如下。

     [
{
"id": "244",
"name": "PIZZAS",
"image": "",
"coupon": "1",
"icon": "",
"order": "1",
"aname": "",
"options": "2",
"subcategory": [
  {
    "id": "515",
    "name": "MARGARITA",
    "description": "Cheese and Tomato",
    "image": "",
    "icon": "",
    "coupon": "1",
    "order": "1",
    "aname": "",
    "options": "2",
    "item": [
      {
        "id": "1749",
        "name": "9 Inch Thin & Crispy Margarita",
        "description": "",
        "price": "3.40",
        "coupon": "1",
        "image": "",
        "options": "2",
        "order": "1",
        "addon": "495",
        "aname": "",
        "icon": ""
      },
      {
        "id": "1750",
        "name": "12 Inch Thin & Crispy Margarita",
        "description": "",
        "price": "5.20",
        "coupon": "1",
        "image": "",
        "options": "2",
        "order": "2",
        "addon": "496",
        "aname": "",
        "icon": ""
      }
      ]
  }

How can i fetch the "subcategory name" as well as " items name". Please help me out.I have written some codes and tried to fetch but not working.

如何获取“子类别名称”和“项目名称”。请帮帮我。我写了一些代码,试着去取回,但没有用。

      var json: NSArray!
        do {
            json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as? NSArray

        } catch {
            print(error)
        }

        self.AllData = json.valueForKey("subcategory") as! Array<String>
        print(self.AllData)
        print(self.AllData.count)

But its not fetching any value Other way also I have tried but still no data fetching . only the data is coming in json1.

但是它没有取任何值,我也试过了,但仍然没有数据取回。只有数据在json1中出现。

    do {
            let json1 = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())
           // print(json1)

            if let subcategory = json1["subcategory"] as? [[String: AnyObject]] {
                for subname in subcategory {
                    if let name = subname["name"] as? String {
                        print(name)
                    }
                    if let items = subname["item"] as? [[String: AnyObject]] {
                        for item in items {
                            if let itemName = item["name"] as? String {
                                print(itemName)
                            }
                        }
                    }
                }
            }
        } catch {
            print(error)
        }

2 个解决方案

#1


0  

At first its an array of objects/Dictionary.And you are creating an array of string. Thats why for subcategory it will not work.You need to create an array of Dictionaries like this:

首先它是一个对象/字典数组。你正在创建一个字符串数组。这就是为什么在子类别中它不会起作用。您需要创建这样的字典数组:

        do {
            let json1 = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())

            self.AllData = json1.valueForKey("name") as! Array<String>
            print(self.AllData)


            print("Number of menu = \(json1.count)")
            for var i in 0..<json1.count {
              print(" \n \(i+1) row menu \n")


                if let subs = json1[i]["subcategory"] as? [[String: AnyObject]] {
                    //print(subs)


                    for sub in subs {

                        if let name = sub["name"] as? String {
                            print("subcategory name= \t \(name)")
                            //print(name)
                        }



                        if let desc = sub["description"] as? String {
                            print("description= \t \(desc)")
                           // print(desc)
                        }


                }

                    print("Number of subcategory= \(subs.count)")
                    for var i in 0..<subs.count {


                     if let items = subs[i]["item"] as? [[String: AnyObject]] {
                     print("items = ")
                        print(items.count)
                       for item in items {
                            if let itemName = item["name"] as? String {
                                print(itemName)

                              }
                         }
                     }
                 }


                }

            }
                        }catch {
            print(error)
        }

Try this one it will work accoording to your json data

试试这个,它将与您的json数据协同工作。

#2


0  

This may just be a problem when cutting and pasting into the question, but it looks like your JSON data isn't formatted correctly (the []s and {}s don't match up). As the previous commentor said, you're dealing with an array of dictionaries not an array of strings. Try something like this:

这可能只是在剪切和粘贴问题时出现的问题,但是看起来您的JSON数据没有正确格式化([]s和{}不匹配)。正如前面的评论所说,您正在处理的是一系列字典,而不是字符串数组。试试这样:

do {
    let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())

    if let subs = json[0]["subcategory"] as? [[String: AnyObject]] {
        for sub in subs {
            if let name = sub["name"] as? String {
                print(name)
            }
            if let items = sub["item"] as? [[String: AnyObject]] {
                for item in items {
                    if let itemName = item["name"] as? String {
                        print(itemName)
                    }
                }
            }
        }
    }
} catch {
    print(error)
}

#1


0  

At first its an array of objects/Dictionary.And you are creating an array of string. Thats why for subcategory it will not work.You need to create an array of Dictionaries like this:

首先它是一个对象/字典数组。你正在创建一个字符串数组。这就是为什么在子类别中它不会起作用。您需要创建这样的字典数组:

        do {
            let json1 = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())

            self.AllData = json1.valueForKey("name") as! Array<String>
            print(self.AllData)


            print("Number of menu = \(json1.count)")
            for var i in 0..<json1.count {
              print(" \n \(i+1) row menu \n")


                if let subs = json1[i]["subcategory"] as? [[String: AnyObject]] {
                    //print(subs)


                    for sub in subs {

                        if let name = sub["name"] as? String {
                            print("subcategory name= \t \(name)")
                            //print(name)
                        }



                        if let desc = sub["description"] as? String {
                            print("description= \t \(desc)")
                           // print(desc)
                        }


                }

                    print("Number of subcategory= \(subs.count)")
                    for var i in 0..<subs.count {


                     if let items = subs[i]["item"] as? [[String: AnyObject]] {
                     print("items = ")
                        print(items.count)
                       for item in items {
                            if let itemName = item["name"] as? String {
                                print(itemName)

                              }
                         }
                     }
                 }


                }

            }
                        }catch {
            print(error)
        }

Try this one it will work accoording to your json data

试试这个,它将与您的json数据协同工作。

#2


0  

This may just be a problem when cutting and pasting into the question, but it looks like your JSON data isn't formatted correctly (the []s and {}s don't match up). As the previous commentor said, you're dealing with an array of dictionaries not an array of strings. Try something like this:

这可能只是在剪切和粘贴问题时出现的问题,但是看起来您的JSON数据没有正确格式化([]s和{}不匹配)。正如前面的评论所说,您正在处理的是一系列字典,而不是字符串数组。试试这样:

do {
    let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())

    if let subs = json[0]["subcategory"] as? [[String: AnyObject]] {
        for sub in subs {
            if let name = sub["name"] as? String {
                print(name)
            }
            if let items = sub["item"] as? [[String: AnyObject]] {
                for item in items {
                    if let itemName = item["name"] as? String {
                        print(itemName)
                    }
                }
            }
        }
    }
} catch {
    print(error)
}