populating table view with json data swift 4












1















I have got json data and I can parse the first part which is nav and name, however I need to parse the array children into a table view.



{
"nav": [
{
"name": "Home",
"navigationName": "Home",
"icon": null,
"navigation": {
"URI": null,
"type": "CUSTOM",
"target": "home",
"depth": null,
"data": null,
"filters": {},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles":
},
{
"name": "New In",
"navigationName": "New In",
"icon": null,
"navigation": {
"URI": null,
"type": "NO_LINK",
"target": "",
"depth": null,
"data": null,
"filters": {},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles": [
"linkNewin"
],
"children": [
{
"name": "New In Mens",
"navigationName": "New In Mens",
"icon": null,
"navigation": {
"URI": "/men?facet:new=latest&sort=latest",
"type": "CATEGORY",
"target": "men",
"depth": null,
"data": null,
"filters": {
"facet:new": "latest",
"sort": "latest"
},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles": [
"linkNewin"
]
},


That is the json data. I have parsed and populated the first name in the array nav, but cannot do it for the Children array.



I have created this data model so far:



struct Menu: Codable {
var nav = [Menus]()
}

struct Menus: Codable {
var name: String
var children: ChildrensNames
}

struct ChildrensNames: Codable {
var name: String
}


Does anyone have any ideas?



I have got the structs working so when I add a break point in I can see the children's names, however I do not know how to access these and add them to a second section in. Below is my table view set up



extension MenuViewController: UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

if section == 0{
return self.menu?.nav.count ?? 0
} else if section == 1 {
return self.menuItems?.children?.count ?? 0
} else {
return 2
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

var cell = tableView.dequeueReusableCell(withIdentifier: "cell")

if cell == nil {
cell = UITableViewCell.init(style: .value1, reuseIdentifier: "cell")
}

let navItem = self.menu?.nav[indexPath.row].name
let childItem = self.menu?.nav[indexPath.row].children


switch indexPath.section {
case 0:
cell?.textLabel?.text = navItem
break
case 1:
// cell?.textLabel?.text =

break
default:
break
}


cell?.accessoryView = UIImageView(image: UIImage(named: "icons8-chevron-right-50"))


return cell!
}


}










share|improve this question

























  • Possible duplicate of Parsing nested JSON using Codable

    – Adrian
    Nov 18 '18 at 3:16
















1















I have got json data and I can parse the first part which is nav and name, however I need to parse the array children into a table view.



{
"nav": [
{
"name": "Home",
"navigationName": "Home",
"icon": null,
"navigation": {
"URI": null,
"type": "CUSTOM",
"target": "home",
"depth": null,
"data": null,
"filters": {},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles":
},
{
"name": "New In",
"navigationName": "New In",
"icon": null,
"navigation": {
"URI": null,
"type": "NO_LINK",
"target": "",
"depth": null,
"data": null,
"filters": {},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles": [
"linkNewin"
],
"children": [
{
"name": "New In Mens",
"navigationName": "New In Mens",
"icon": null,
"navigation": {
"URI": "/men?facet:new=latest&sort=latest",
"type": "CATEGORY",
"target": "men",
"depth": null,
"data": null,
"filters": {
"facet:new": "latest",
"sort": "latest"
},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles": [
"linkNewin"
]
},


That is the json data. I have parsed and populated the first name in the array nav, but cannot do it for the Children array.



I have created this data model so far:



struct Menu: Codable {
var nav = [Menus]()
}

struct Menus: Codable {
var name: String
var children: ChildrensNames
}

struct ChildrensNames: Codable {
var name: String
}


Does anyone have any ideas?



I have got the structs working so when I add a break point in I can see the children's names, however I do not know how to access these and add them to a second section in. Below is my table view set up



extension MenuViewController: UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

if section == 0{
return self.menu?.nav.count ?? 0
} else if section == 1 {
return self.menuItems?.children?.count ?? 0
} else {
return 2
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

var cell = tableView.dequeueReusableCell(withIdentifier: "cell")

if cell == nil {
cell = UITableViewCell.init(style: .value1, reuseIdentifier: "cell")
}

let navItem = self.menu?.nav[indexPath.row].name
let childItem = self.menu?.nav[indexPath.row].children


switch indexPath.section {
case 0:
cell?.textLabel?.text = navItem
break
case 1:
// cell?.textLabel?.text =

break
default:
break
}


cell?.accessoryView = UIImageView(image: UIImage(named: "icons8-chevron-right-50"))


return cell!
}


}










share|improve this question

























  • Possible duplicate of Parsing nested JSON using Codable

    – Adrian
    Nov 18 '18 at 3:16














1












1








1








I have got json data and I can parse the first part which is nav and name, however I need to parse the array children into a table view.



{
"nav": [
{
"name": "Home",
"navigationName": "Home",
"icon": null,
"navigation": {
"URI": null,
"type": "CUSTOM",
"target": "home",
"depth": null,
"data": null,
"filters": {},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles":
},
{
"name": "New In",
"navigationName": "New In",
"icon": null,
"navigation": {
"URI": null,
"type": "NO_LINK",
"target": "",
"depth": null,
"data": null,
"filters": {},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles": [
"linkNewin"
],
"children": [
{
"name": "New In Mens",
"navigationName": "New In Mens",
"icon": null,
"navigation": {
"URI": "/men?facet:new=latest&sort=latest",
"type": "CATEGORY",
"target": "men",
"depth": null,
"data": null,
"filters": {
"facet:new": "latest",
"sort": "latest"
},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles": [
"linkNewin"
]
},


That is the json data. I have parsed and populated the first name in the array nav, but cannot do it for the Children array.



I have created this data model so far:



struct Menu: Codable {
var nav = [Menus]()
}

struct Menus: Codable {
var name: String
var children: ChildrensNames
}

struct ChildrensNames: Codable {
var name: String
}


Does anyone have any ideas?



I have got the structs working so when I add a break point in I can see the children's names, however I do not know how to access these and add them to a second section in. Below is my table view set up



extension MenuViewController: UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

if section == 0{
return self.menu?.nav.count ?? 0
} else if section == 1 {
return self.menuItems?.children?.count ?? 0
} else {
return 2
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

var cell = tableView.dequeueReusableCell(withIdentifier: "cell")

if cell == nil {
cell = UITableViewCell.init(style: .value1, reuseIdentifier: "cell")
}

let navItem = self.menu?.nav[indexPath.row].name
let childItem = self.menu?.nav[indexPath.row].children


switch indexPath.section {
case 0:
cell?.textLabel?.text = navItem
break
case 1:
// cell?.textLabel?.text =

break
default:
break
}


cell?.accessoryView = UIImageView(image: UIImage(named: "icons8-chevron-right-50"))


return cell!
}


}










share|improve this question
















I have got json data and I can parse the first part which is nav and name, however I need to parse the array children into a table view.



{
"nav": [
{
"name": "Home",
"navigationName": "Home",
"icon": null,
"navigation": {
"URI": null,
"type": "CUSTOM",
"target": "home",
"depth": null,
"data": null,
"filters": {},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles":
},
{
"name": "New In",
"navigationName": "New In",
"icon": null,
"navigation": {
"URI": null,
"type": "NO_LINK",
"target": "",
"depth": null,
"data": null,
"filters": {},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles": [
"linkNewin"
],
"children": [
{
"name": "New In Mens",
"navigationName": "New In Mens",
"icon": null,
"navigation": {
"URI": "/men?facet:new=latest&sort=latest",
"type": "CATEGORY",
"target": "men",
"depth": null,
"data": null,
"filters": {
"facet:new": "latest",
"sort": "latest"
},
"urlStructure": {
"title": null,
"isFeatured": false,
"isCampaign": false
}
},
"styles": [
"linkNewin"
]
},


That is the json data. I have parsed and populated the first name in the array nav, but cannot do it for the Children array.



I have created this data model so far:



struct Menu: Codable {
var nav = [Menus]()
}

struct Menus: Codable {
var name: String
var children: ChildrensNames
}

struct ChildrensNames: Codable {
var name: String
}


Does anyone have any ideas?



I have got the structs working so when I add a break point in I can see the children's names, however I do not know how to access these and add them to a second section in. Below is my table view set up



extension MenuViewController: UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

if section == 0{
return self.menu?.nav.count ?? 0
} else if section == 1 {
return self.menuItems?.children?.count ?? 0
} else {
return 2
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

var cell = tableView.dequeueReusableCell(withIdentifier: "cell")

if cell == nil {
cell = UITableViewCell.init(style: .value1, reuseIdentifier: "cell")
}

let navItem = self.menu?.nav[indexPath.row].name
let childItem = self.menu?.nav[indexPath.row].children


switch indexPath.section {
case 0:
cell?.textLabel?.text = navItem
break
case 1:
// cell?.textLabel?.text =

break
default:
break
}


cell?.accessoryView = UIImageView(image: UIImage(named: "icons8-chevron-right-50"))


return cell!
}


}







json swift uitableview






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 18 '18 at 12:13









vadian

147k14159177




147k14159177










asked Nov 18 '18 at 1:39









Nathan TugwellNathan Tugwell

94




94













  • Possible duplicate of Parsing nested JSON using Codable

    – Adrian
    Nov 18 '18 at 3:16



















  • Possible duplicate of Parsing nested JSON using Codable

    – Adrian
    Nov 18 '18 at 3:16

















Possible duplicate of Parsing nested JSON using Codable

– Adrian
Nov 18 '18 at 3:16





Possible duplicate of Parsing nested JSON using Codable

– Adrian
Nov 18 '18 at 3:16












3 Answers
3






active

oldest

votes


















1














First of all let's rename Menus to avoid confusion. Let's name it NavigationItem.



The value for key children is also an array of NavigationItem and as some dictionaries don't have children make it optional.



If the structs are read-only adopt only Decodable and declare the struct members as constants.



struct Menu: Decodable {
let nav : [NavigationItem] // Don't declare this struct member as empty array
}

struct NavigationItem : Decodable {
let name : String
let navigationName : String
let children : [NavigationItem]?
}





share|improve this answer
























  • ok i have done that, how i would i then get the data from children and populate that in a table view?

    – Nathan Tugwell
    Nov 18 '18 at 10:47











  • It depends on the data source structure of the table view. Basically use two for loops to iterate nav and children

    – vadian
    Nov 18 '18 at 11:24











  • let navItem = self.menu?.nav[indexPath.row].name switch indexPath.section { case 0: cell?.textLabel?.text = navItem break case 1: for _ in navItem! { if self.menu?.nav[indexPath.row].children == nil { return cell! } else { for child in childItems! { cell?.textLabel?.text = }

    – Nathan Tugwell
    Nov 18 '18 at 11:27













  • that is what i have to populate the table at the moment, i can populate the nav name but not the child name

    – Nathan Tugwell
    Nov 18 '18 at 11:29











  • Please edit your question, add the code and a description about the expected sections and rows of the table view.

    – vadian
    Nov 18 '18 at 11:43



















0














In the JSON data “children” is an array,so you could try this:



struct Menus: Codable {
var name: String
var children: [ChildrensNames]
}


Best Wishes!






share|improve this answer

































    0














    Try this solution - in order to decode properly you need to define the data provider successfully :



    struct Nav: Decodable {
    let nav: [NavItem]
    }

    struct NavItem: Decodable {
    var name : String?
    var navigationName : String?
    var children: [ChildrenArr]
    //And so on
    }


    then you can scode it like this:



    do {
    let nav = try JSONDecoder().decode(Nav.self, from: data)
    //Do somthing
    } catch let error{
    print(error)
    }


    so the tableview should look like this:



    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let sectionHeaderCell = tableView.dequeueReusableCell(withIdentifier: "Section") as! SectionTableViewCell

    sectionHeaderCell.name.text = nav?.nav[section].name

    return sectionHeaderCell
    }

    func numberOfSections(in tableView: UITableView) -> Int {
    return self.nav?.nav.count ?? 0
    }



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.nav?.nav[section]. children.count ?? 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ChildTableViewCell

    cell.name.text = self.nav?.nav[indexPath.section]. children[indexPath.row]

    return cell
    }


    the arr referees to the children array
    hope this will help






    share|improve this answer


























    • Hi, Thanks for you answer, Do you have an idea about the rest of the question?

      – Nathan Tugwell
      Nov 18 '18 at 14:21











    • Why do you need different sections?

      – ironRoei
      Nov 18 '18 at 14:24











    • Because I want the children array to display in a different section, so when I can display them I’m going to make it into a expandable table view

      – Nathan Tugwell
      Nov 18 '18 at 14:27











    • This is children for you?: { "name": "Home", "navigationName": "Home", "icon": null, "navigation": { "URI": null, "type": "CUSTOM", "target": "home", "depth": null, "data": null, "filters": {}, "urlStructure": { "title": null, "isFeatured": false, "isCampaign": false } }, "styles": }

      – ironRoei
      Nov 18 '18 at 14:31











    • for me children is: `"children": [ { "name": "New In Mens", "navigationName": "New In Mens", "icon": null, "navigation": { "URI": "/men?facet:new=latest&sort=latest", "type": "CATEGORY", "target": "men", "depth": null, ]

      – Nathan Tugwell
      Nov 18 '18 at 14:44











    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53357177%2fpopulating-table-view-with-json-data-swift-4%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    First of all let's rename Menus to avoid confusion. Let's name it NavigationItem.



    The value for key children is also an array of NavigationItem and as some dictionaries don't have children make it optional.



    If the structs are read-only adopt only Decodable and declare the struct members as constants.



    struct Menu: Decodable {
    let nav : [NavigationItem] // Don't declare this struct member as empty array
    }

    struct NavigationItem : Decodable {
    let name : String
    let navigationName : String
    let children : [NavigationItem]?
    }





    share|improve this answer
























    • ok i have done that, how i would i then get the data from children and populate that in a table view?

      – Nathan Tugwell
      Nov 18 '18 at 10:47











    • It depends on the data source structure of the table view. Basically use two for loops to iterate nav and children

      – vadian
      Nov 18 '18 at 11:24











    • let navItem = self.menu?.nav[indexPath.row].name switch indexPath.section { case 0: cell?.textLabel?.text = navItem break case 1: for _ in navItem! { if self.menu?.nav[indexPath.row].children == nil { return cell! } else { for child in childItems! { cell?.textLabel?.text = }

      – Nathan Tugwell
      Nov 18 '18 at 11:27













    • that is what i have to populate the table at the moment, i can populate the nav name but not the child name

      – Nathan Tugwell
      Nov 18 '18 at 11:29











    • Please edit your question, add the code and a description about the expected sections and rows of the table view.

      – vadian
      Nov 18 '18 at 11:43
















    1














    First of all let's rename Menus to avoid confusion. Let's name it NavigationItem.



    The value for key children is also an array of NavigationItem and as some dictionaries don't have children make it optional.



    If the structs are read-only adopt only Decodable and declare the struct members as constants.



    struct Menu: Decodable {
    let nav : [NavigationItem] // Don't declare this struct member as empty array
    }

    struct NavigationItem : Decodable {
    let name : String
    let navigationName : String
    let children : [NavigationItem]?
    }





    share|improve this answer
























    • ok i have done that, how i would i then get the data from children and populate that in a table view?

      – Nathan Tugwell
      Nov 18 '18 at 10:47











    • It depends on the data source structure of the table view. Basically use two for loops to iterate nav and children

      – vadian
      Nov 18 '18 at 11:24











    • let navItem = self.menu?.nav[indexPath.row].name switch indexPath.section { case 0: cell?.textLabel?.text = navItem break case 1: for _ in navItem! { if self.menu?.nav[indexPath.row].children == nil { return cell! } else { for child in childItems! { cell?.textLabel?.text = }

      – Nathan Tugwell
      Nov 18 '18 at 11:27













    • that is what i have to populate the table at the moment, i can populate the nav name but not the child name

      – Nathan Tugwell
      Nov 18 '18 at 11:29











    • Please edit your question, add the code and a description about the expected sections and rows of the table view.

      – vadian
      Nov 18 '18 at 11:43














    1












    1








    1







    First of all let's rename Menus to avoid confusion. Let's name it NavigationItem.



    The value for key children is also an array of NavigationItem and as some dictionaries don't have children make it optional.



    If the structs are read-only adopt only Decodable and declare the struct members as constants.



    struct Menu: Decodable {
    let nav : [NavigationItem] // Don't declare this struct member as empty array
    }

    struct NavigationItem : Decodable {
    let name : String
    let navigationName : String
    let children : [NavigationItem]?
    }





    share|improve this answer













    First of all let's rename Menus to avoid confusion. Let's name it NavigationItem.



    The value for key children is also an array of NavigationItem and as some dictionaries don't have children make it optional.



    If the structs are read-only adopt only Decodable and declare the struct members as constants.



    struct Menu: Decodable {
    let nav : [NavigationItem] // Don't declare this struct member as empty array
    }

    struct NavigationItem : Decodable {
    let name : String
    let navigationName : String
    let children : [NavigationItem]?
    }






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 18 '18 at 7:46









    vadianvadian

    147k14159177




    147k14159177













    • ok i have done that, how i would i then get the data from children and populate that in a table view?

      – Nathan Tugwell
      Nov 18 '18 at 10:47











    • It depends on the data source structure of the table view. Basically use two for loops to iterate nav and children

      – vadian
      Nov 18 '18 at 11:24











    • let navItem = self.menu?.nav[indexPath.row].name switch indexPath.section { case 0: cell?.textLabel?.text = navItem break case 1: for _ in navItem! { if self.menu?.nav[indexPath.row].children == nil { return cell! } else { for child in childItems! { cell?.textLabel?.text = }

      – Nathan Tugwell
      Nov 18 '18 at 11:27













    • that is what i have to populate the table at the moment, i can populate the nav name but not the child name

      – Nathan Tugwell
      Nov 18 '18 at 11:29











    • Please edit your question, add the code and a description about the expected sections and rows of the table view.

      – vadian
      Nov 18 '18 at 11:43



















    • ok i have done that, how i would i then get the data from children and populate that in a table view?

      – Nathan Tugwell
      Nov 18 '18 at 10:47











    • It depends on the data source structure of the table view. Basically use two for loops to iterate nav and children

      – vadian
      Nov 18 '18 at 11:24











    • let navItem = self.menu?.nav[indexPath.row].name switch indexPath.section { case 0: cell?.textLabel?.text = navItem break case 1: for _ in navItem! { if self.menu?.nav[indexPath.row].children == nil { return cell! } else { for child in childItems! { cell?.textLabel?.text = }

      – Nathan Tugwell
      Nov 18 '18 at 11:27













    • that is what i have to populate the table at the moment, i can populate the nav name but not the child name

      – Nathan Tugwell
      Nov 18 '18 at 11:29











    • Please edit your question, add the code and a description about the expected sections and rows of the table view.

      – vadian
      Nov 18 '18 at 11:43

















    ok i have done that, how i would i then get the data from children and populate that in a table view?

    – Nathan Tugwell
    Nov 18 '18 at 10:47





    ok i have done that, how i would i then get the data from children and populate that in a table view?

    – Nathan Tugwell
    Nov 18 '18 at 10:47













    It depends on the data source structure of the table view. Basically use two for loops to iterate nav and children

    – vadian
    Nov 18 '18 at 11:24





    It depends on the data source structure of the table view. Basically use two for loops to iterate nav and children

    – vadian
    Nov 18 '18 at 11:24













    let navItem = self.menu?.nav[indexPath.row].name switch indexPath.section { case 0: cell?.textLabel?.text = navItem break case 1: for _ in navItem! { if self.menu?.nav[indexPath.row].children == nil { return cell! } else { for child in childItems! { cell?.textLabel?.text = }

    – Nathan Tugwell
    Nov 18 '18 at 11:27







    let navItem = self.menu?.nav[indexPath.row].name switch indexPath.section { case 0: cell?.textLabel?.text = navItem break case 1: for _ in navItem! { if self.menu?.nav[indexPath.row].children == nil { return cell! } else { for child in childItems! { cell?.textLabel?.text = }

    – Nathan Tugwell
    Nov 18 '18 at 11:27















    that is what i have to populate the table at the moment, i can populate the nav name but not the child name

    – Nathan Tugwell
    Nov 18 '18 at 11:29





    that is what i have to populate the table at the moment, i can populate the nav name but not the child name

    – Nathan Tugwell
    Nov 18 '18 at 11:29













    Please edit your question, add the code and a description about the expected sections and rows of the table view.

    – vadian
    Nov 18 '18 at 11:43





    Please edit your question, add the code and a description about the expected sections and rows of the table view.

    – vadian
    Nov 18 '18 at 11:43













    0














    In the JSON data “children” is an array,so you could try this:



    struct Menus: Codable {
    var name: String
    var children: [ChildrensNames]
    }


    Best Wishes!






    share|improve this answer






























      0














      In the JSON data “children” is an array,so you could try this:



      struct Menus: Codable {
      var name: String
      var children: [ChildrensNames]
      }


      Best Wishes!






      share|improve this answer




























        0












        0








        0







        In the JSON data “children” is an array,so you could try this:



        struct Menus: Codable {
        var name: String
        var children: [ChildrensNames]
        }


        Best Wishes!






        share|improve this answer















        In the JSON data “children” is an array,so you could try this:



        struct Menus: Codable {
        var name: String
        var children: [ChildrensNames]
        }


        Best Wishes!







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 18 '18 at 7:49









        Kurucu

        787823




        787823










        answered Nov 18 '18 at 7:41









        GorCatGorCat

        14




        14























            0














            Try this solution - in order to decode properly you need to define the data provider successfully :



            struct Nav: Decodable {
            let nav: [NavItem]
            }

            struct NavItem: Decodable {
            var name : String?
            var navigationName : String?
            var children: [ChildrenArr]
            //And so on
            }


            then you can scode it like this:



            do {
            let nav = try JSONDecoder().decode(Nav.self, from: data)
            //Do somthing
            } catch let error{
            print(error)
            }


            so the tableview should look like this:



            func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            let sectionHeaderCell = tableView.dequeueReusableCell(withIdentifier: "Section") as! SectionTableViewCell

            sectionHeaderCell.name.text = nav?.nav[section].name

            return sectionHeaderCell
            }

            func numberOfSections(in tableView: UITableView) -> Int {
            return self.nav?.nav.count ?? 0
            }



            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.nav?.nav[section]. children.count ?? 0
            }

            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ChildTableViewCell

            cell.name.text = self.nav?.nav[indexPath.section]. children[indexPath.row]

            return cell
            }


            the arr referees to the children array
            hope this will help






            share|improve this answer


























            • Hi, Thanks for you answer, Do you have an idea about the rest of the question?

              – Nathan Tugwell
              Nov 18 '18 at 14:21











            • Why do you need different sections?

              – ironRoei
              Nov 18 '18 at 14:24











            • Because I want the children array to display in a different section, so when I can display them I’m going to make it into a expandable table view

              – Nathan Tugwell
              Nov 18 '18 at 14:27











            • This is children for you?: { "name": "Home", "navigationName": "Home", "icon": null, "navigation": { "URI": null, "type": "CUSTOM", "target": "home", "depth": null, "data": null, "filters": {}, "urlStructure": { "title": null, "isFeatured": false, "isCampaign": false } }, "styles": }

              – ironRoei
              Nov 18 '18 at 14:31











            • for me children is: `"children": [ { "name": "New In Mens", "navigationName": "New In Mens", "icon": null, "navigation": { "URI": "/men?facet:new=latest&sort=latest", "type": "CATEGORY", "target": "men", "depth": null, ]

              – Nathan Tugwell
              Nov 18 '18 at 14:44
















            0














            Try this solution - in order to decode properly you need to define the data provider successfully :



            struct Nav: Decodable {
            let nav: [NavItem]
            }

            struct NavItem: Decodable {
            var name : String?
            var navigationName : String?
            var children: [ChildrenArr]
            //And so on
            }


            then you can scode it like this:



            do {
            let nav = try JSONDecoder().decode(Nav.self, from: data)
            //Do somthing
            } catch let error{
            print(error)
            }


            so the tableview should look like this:



            func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            let sectionHeaderCell = tableView.dequeueReusableCell(withIdentifier: "Section") as! SectionTableViewCell

            sectionHeaderCell.name.text = nav?.nav[section].name

            return sectionHeaderCell
            }

            func numberOfSections(in tableView: UITableView) -> Int {
            return self.nav?.nav.count ?? 0
            }



            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.nav?.nav[section]. children.count ?? 0
            }

            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ChildTableViewCell

            cell.name.text = self.nav?.nav[indexPath.section]. children[indexPath.row]

            return cell
            }


            the arr referees to the children array
            hope this will help






            share|improve this answer


























            • Hi, Thanks for you answer, Do you have an idea about the rest of the question?

              – Nathan Tugwell
              Nov 18 '18 at 14:21











            • Why do you need different sections?

              – ironRoei
              Nov 18 '18 at 14:24











            • Because I want the children array to display in a different section, so when I can display them I’m going to make it into a expandable table view

              – Nathan Tugwell
              Nov 18 '18 at 14:27











            • This is children for you?: { "name": "Home", "navigationName": "Home", "icon": null, "navigation": { "URI": null, "type": "CUSTOM", "target": "home", "depth": null, "data": null, "filters": {}, "urlStructure": { "title": null, "isFeatured": false, "isCampaign": false } }, "styles": }

              – ironRoei
              Nov 18 '18 at 14:31











            • for me children is: `"children": [ { "name": "New In Mens", "navigationName": "New In Mens", "icon": null, "navigation": { "URI": "/men?facet:new=latest&sort=latest", "type": "CATEGORY", "target": "men", "depth": null, ]

              – Nathan Tugwell
              Nov 18 '18 at 14:44














            0












            0








            0







            Try this solution - in order to decode properly you need to define the data provider successfully :



            struct Nav: Decodable {
            let nav: [NavItem]
            }

            struct NavItem: Decodable {
            var name : String?
            var navigationName : String?
            var children: [ChildrenArr]
            //And so on
            }


            then you can scode it like this:



            do {
            let nav = try JSONDecoder().decode(Nav.self, from: data)
            //Do somthing
            } catch let error{
            print(error)
            }


            so the tableview should look like this:



            func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            let sectionHeaderCell = tableView.dequeueReusableCell(withIdentifier: "Section") as! SectionTableViewCell

            sectionHeaderCell.name.text = nav?.nav[section].name

            return sectionHeaderCell
            }

            func numberOfSections(in tableView: UITableView) -> Int {
            return self.nav?.nav.count ?? 0
            }



            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.nav?.nav[section]. children.count ?? 0
            }

            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ChildTableViewCell

            cell.name.text = self.nav?.nav[indexPath.section]. children[indexPath.row]

            return cell
            }


            the arr referees to the children array
            hope this will help






            share|improve this answer















            Try this solution - in order to decode properly you need to define the data provider successfully :



            struct Nav: Decodable {
            let nav: [NavItem]
            }

            struct NavItem: Decodable {
            var name : String?
            var navigationName : String?
            var children: [ChildrenArr]
            //And so on
            }


            then you can scode it like this:



            do {
            let nav = try JSONDecoder().decode(Nav.self, from: data)
            //Do somthing
            } catch let error{
            print(error)
            }


            so the tableview should look like this:



            func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            let sectionHeaderCell = tableView.dequeueReusableCell(withIdentifier: "Section") as! SectionTableViewCell

            sectionHeaderCell.name.text = nav?.nav[section].name

            return sectionHeaderCell
            }

            func numberOfSections(in tableView: UITableView) -> Int {
            return self.nav?.nav.count ?? 0
            }



            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.nav?.nav[section]. children.count ?? 0
            }

            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ChildTableViewCell

            cell.name.text = self.nav?.nav[indexPath.section]. children[indexPath.row]

            return cell
            }


            the arr referees to the children array
            hope this will help







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Nov 19 '18 at 7:53

























            answered Nov 18 '18 at 14:17









            ironRoeiironRoei

            342112




            342112













            • Hi, Thanks for you answer, Do you have an idea about the rest of the question?

              – Nathan Tugwell
              Nov 18 '18 at 14:21











            • Why do you need different sections?

              – ironRoei
              Nov 18 '18 at 14:24











            • Because I want the children array to display in a different section, so when I can display them I’m going to make it into a expandable table view

              – Nathan Tugwell
              Nov 18 '18 at 14:27











            • This is children for you?: { "name": "Home", "navigationName": "Home", "icon": null, "navigation": { "URI": null, "type": "CUSTOM", "target": "home", "depth": null, "data": null, "filters": {}, "urlStructure": { "title": null, "isFeatured": false, "isCampaign": false } }, "styles": }

              – ironRoei
              Nov 18 '18 at 14:31











            • for me children is: `"children": [ { "name": "New In Mens", "navigationName": "New In Mens", "icon": null, "navigation": { "URI": "/men?facet:new=latest&sort=latest", "type": "CATEGORY", "target": "men", "depth": null, ]

              – Nathan Tugwell
              Nov 18 '18 at 14:44



















            • Hi, Thanks for you answer, Do you have an idea about the rest of the question?

              – Nathan Tugwell
              Nov 18 '18 at 14:21











            • Why do you need different sections?

              – ironRoei
              Nov 18 '18 at 14:24











            • Because I want the children array to display in a different section, so when I can display them I’m going to make it into a expandable table view

              – Nathan Tugwell
              Nov 18 '18 at 14:27











            • This is children for you?: { "name": "Home", "navigationName": "Home", "icon": null, "navigation": { "URI": null, "type": "CUSTOM", "target": "home", "depth": null, "data": null, "filters": {}, "urlStructure": { "title": null, "isFeatured": false, "isCampaign": false } }, "styles": }

              – ironRoei
              Nov 18 '18 at 14:31











            • for me children is: `"children": [ { "name": "New In Mens", "navigationName": "New In Mens", "icon": null, "navigation": { "URI": "/men?facet:new=latest&sort=latest", "type": "CATEGORY", "target": "men", "depth": null, ]

              – Nathan Tugwell
              Nov 18 '18 at 14:44

















            Hi, Thanks for you answer, Do you have an idea about the rest of the question?

            – Nathan Tugwell
            Nov 18 '18 at 14:21





            Hi, Thanks for you answer, Do you have an idea about the rest of the question?

            – Nathan Tugwell
            Nov 18 '18 at 14:21













            Why do you need different sections?

            – ironRoei
            Nov 18 '18 at 14:24





            Why do you need different sections?

            – ironRoei
            Nov 18 '18 at 14:24













            Because I want the children array to display in a different section, so when I can display them I’m going to make it into a expandable table view

            – Nathan Tugwell
            Nov 18 '18 at 14:27





            Because I want the children array to display in a different section, so when I can display them I’m going to make it into a expandable table view

            – Nathan Tugwell
            Nov 18 '18 at 14:27













            This is children for you?: { "name": "Home", "navigationName": "Home", "icon": null, "navigation": { "URI": null, "type": "CUSTOM", "target": "home", "depth": null, "data": null, "filters": {}, "urlStructure": { "title": null, "isFeatured": false, "isCampaign": false } }, "styles": }

            – ironRoei
            Nov 18 '18 at 14:31





            This is children for you?: { "name": "Home", "navigationName": "Home", "icon": null, "navigation": { "URI": null, "type": "CUSTOM", "target": "home", "depth": null, "data": null, "filters": {}, "urlStructure": { "title": null, "isFeatured": false, "isCampaign": false } }, "styles": }

            – ironRoei
            Nov 18 '18 at 14:31













            for me children is: `"children": [ { "name": "New In Mens", "navigationName": "New In Mens", "icon": null, "navigation": { "URI": "/men?facet:new=latest&sort=latest", "type": "CATEGORY", "target": "men", "depth": null, ]

            – Nathan Tugwell
            Nov 18 '18 at 14:44





            for me children is: `"children": [ { "name": "New In Mens", "navigationName": "New In Mens", "icon": null, "navigation": { "URI": "/men?facet:new=latest&sort=latest", "type": "CATEGORY", "target": "men", "depth": null, ]

            – Nathan Tugwell
            Nov 18 '18 at 14:44


















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53357177%2fpopulating-table-view-with-json-data-swift-4%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            這個網誌中的熱門文章

            Xamarin.form Move up view when keyboard appear

            Post-Redirect-Get with Spring WebFlux and Thymeleaf

            Anylogic : not able to use stopDelay()