Display information from decoded JSON in a UILabel (Swift 4)












-2















I am trying to display information taken from JSON. I've used .decode to get it. Now I want to put its text onto a simple label on my storyboard. At the bottom under ".resume()" is my attempt and it isn't working. I can't seem to figure this out.





import UIKit


struct WebsiteDescription: Decodable {
var name : String
var description : String
var courses : [Course]

}


struct Course: Decodable {
let id: Int
let name: String
let link: String
let imageUrl: String
}

class ViewController: UIViewController {

@IBOutlet weak var displayLabel: UILabel!

override func viewDidLoad() {
super.viewDidLoad()

let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
guard let url = URL(string: jsonUrlString) else {return}
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else {return}

do {
let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
//let courses = try JSONDecoder().decode([Course].self, from: data)
} catch let jsonErr {
print("Error serializing json", jsonErr)
}

}.resume()

let displayLabel.text = websiteDescription.name

}

}









share|improve this question





























    -2















    I am trying to display information taken from JSON. I've used .decode to get it. Now I want to put its text onto a simple label on my storyboard. At the bottom under ".resume()" is my attempt and it isn't working. I can't seem to figure this out.





    import UIKit


    struct WebsiteDescription: Decodable {
    var name : String
    var description : String
    var courses : [Course]

    }


    struct Course: Decodable {
    let id: Int
    let name: String
    let link: String
    let imageUrl: String
    }

    class ViewController: UIViewController {

    @IBOutlet weak var displayLabel: UILabel!

    override func viewDidLoad() {
    super.viewDidLoad()

    let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
    guard let url = URL(string: jsonUrlString) else {return}
    URLSession.shared.dataTask(with: url) { (data, response, err) in
    guard let data = data else {return}

    do {
    let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
    print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
    //let courses = try JSONDecoder().decode([Course].self, from: data)
    } catch let jsonErr {
    print("Error serializing json", jsonErr)
    }

    }.resume()

    let displayLabel.text = websiteDescription.name

    }

    }









    share|improve this question



























      -2












      -2








      -2


      0






      I am trying to display information taken from JSON. I've used .decode to get it. Now I want to put its text onto a simple label on my storyboard. At the bottom under ".resume()" is my attempt and it isn't working. I can't seem to figure this out.





      import UIKit


      struct WebsiteDescription: Decodable {
      var name : String
      var description : String
      var courses : [Course]

      }


      struct Course: Decodable {
      let id: Int
      let name: String
      let link: String
      let imageUrl: String
      }

      class ViewController: UIViewController {

      @IBOutlet weak var displayLabel: UILabel!

      override func viewDidLoad() {
      super.viewDidLoad()

      let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
      guard let url = URL(string: jsonUrlString) else {return}
      URLSession.shared.dataTask(with: url) { (data, response, err) in
      guard let data = data else {return}

      do {
      let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
      print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
      //let courses = try JSONDecoder().decode([Course].self, from: data)
      } catch let jsonErr {
      print("Error serializing json", jsonErr)
      }

      }.resume()

      let displayLabel.text = websiteDescription.name

      }

      }









      share|improve this question
















      I am trying to display information taken from JSON. I've used .decode to get it. Now I want to put its text onto a simple label on my storyboard. At the bottom under ".resume()" is my attempt and it isn't working. I can't seem to figure this out.





      import UIKit


      struct WebsiteDescription: Decodable {
      var name : String
      var description : String
      var courses : [Course]

      }


      struct Course: Decodable {
      let id: Int
      let name: String
      let link: String
      let imageUrl: String
      }

      class ViewController: UIViewController {

      @IBOutlet weak var displayLabel: UILabel!

      override func viewDidLoad() {
      super.viewDidLoad()

      let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
      guard let url = URL(string: jsonUrlString) else {return}
      URLSession.shared.dataTask(with: url) { (data, response, err) in
      guard let data = data else {return}

      do {
      let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
      print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
      //let courses = try JSONDecoder().decode([Course].self, from: data)
      } catch let jsonErr {
      print("Error serializing json", jsonErr)
      }

      }.resume()

      let displayLabel.text = websiteDescription.name

      }

      }






      ios json swift decode






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 29 '18 at 16:13









      Koen

      2,26522459




      2,26522459










      asked Nov 29 '18 at 0:05









      WestopherWestopher

      48




      48
























          1 Answer
          1






          active

          oldest

          votes


















          0














          You need to update your label from within the do method. Also you should do it from the main thread so that the UI can be updated. I have updated the code below.



          import UIKit

          struct WebsiteDescription: Decodable {
          var name : String
          var description : String
          var courses : [Course]
          }

          struct Course: Decodable {
          let id: Int
          let name: String
          let link: String
          let imageUrl: String
          }

          class ViewController: UIViewController {

          @IBOutlet weak var displayLabel: UILabel!

          override func viewDidLoad() {
          super.viewDidLoad()

          let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
          guard let url = URL(string: jsonUrlString) else {return}
          URLSession.shared.dataTask(with: url) { (data, response, err) in
          guard let data = data else {return}

          do {
          let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
          print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
          //let courses = try JSONDecoder().decode([Course].self, from: data)

          DispatchQueue.main.async {
          self.displayLabel.text = websiteDescription.name
          }

          } catch let jsonErr {
          print("Error serializing json", jsonErr)
          }

          }.resume()
          }





          share|improve this answer
























          • This is a lifesaver. Thank you @Cedan!

            – Westopher
            Nov 29 '18 at 1:40






          • 1





            @Westopher: Glad that this answer works for you. Please upvote and accept the answer to acknowledge it.

            – Koen
            Nov 29 '18 at 16:15











          • @Westopher You are welcome. Please upvote and accept this as the answer. Thanks.

            – Cedan Misquith
            Nov 29 '18 at 16:19












          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%2f53529988%2fdisplay-information-from-decoded-json-in-a-uilabel-swift-4%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          You need to update your label from within the do method. Also you should do it from the main thread so that the UI can be updated. I have updated the code below.



          import UIKit

          struct WebsiteDescription: Decodable {
          var name : String
          var description : String
          var courses : [Course]
          }

          struct Course: Decodable {
          let id: Int
          let name: String
          let link: String
          let imageUrl: String
          }

          class ViewController: UIViewController {

          @IBOutlet weak var displayLabel: UILabel!

          override func viewDidLoad() {
          super.viewDidLoad()

          let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
          guard let url = URL(string: jsonUrlString) else {return}
          URLSession.shared.dataTask(with: url) { (data, response, err) in
          guard let data = data else {return}

          do {
          let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
          print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
          //let courses = try JSONDecoder().decode([Course].self, from: data)

          DispatchQueue.main.async {
          self.displayLabel.text = websiteDescription.name
          }

          } catch let jsonErr {
          print("Error serializing json", jsonErr)
          }

          }.resume()
          }





          share|improve this answer
























          • This is a lifesaver. Thank you @Cedan!

            – Westopher
            Nov 29 '18 at 1:40






          • 1





            @Westopher: Glad that this answer works for you. Please upvote and accept the answer to acknowledge it.

            – Koen
            Nov 29 '18 at 16:15











          • @Westopher You are welcome. Please upvote and accept this as the answer. Thanks.

            – Cedan Misquith
            Nov 29 '18 at 16:19
















          0














          You need to update your label from within the do method. Also you should do it from the main thread so that the UI can be updated. I have updated the code below.



          import UIKit

          struct WebsiteDescription: Decodable {
          var name : String
          var description : String
          var courses : [Course]
          }

          struct Course: Decodable {
          let id: Int
          let name: String
          let link: String
          let imageUrl: String
          }

          class ViewController: UIViewController {

          @IBOutlet weak var displayLabel: UILabel!

          override func viewDidLoad() {
          super.viewDidLoad()

          let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
          guard let url = URL(string: jsonUrlString) else {return}
          URLSession.shared.dataTask(with: url) { (data, response, err) in
          guard let data = data else {return}

          do {
          let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
          print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
          //let courses = try JSONDecoder().decode([Course].self, from: data)

          DispatchQueue.main.async {
          self.displayLabel.text = websiteDescription.name
          }

          } catch let jsonErr {
          print("Error serializing json", jsonErr)
          }

          }.resume()
          }





          share|improve this answer
























          • This is a lifesaver. Thank you @Cedan!

            – Westopher
            Nov 29 '18 at 1:40






          • 1





            @Westopher: Glad that this answer works for you. Please upvote and accept the answer to acknowledge it.

            – Koen
            Nov 29 '18 at 16:15











          • @Westopher You are welcome. Please upvote and accept this as the answer. Thanks.

            – Cedan Misquith
            Nov 29 '18 at 16:19














          0












          0








          0







          You need to update your label from within the do method. Also you should do it from the main thread so that the UI can be updated. I have updated the code below.



          import UIKit

          struct WebsiteDescription: Decodable {
          var name : String
          var description : String
          var courses : [Course]
          }

          struct Course: Decodable {
          let id: Int
          let name: String
          let link: String
          let imageUrl: String
          }

          class ViewController: UIViewController {

          @IBOutlet weak var displayLabel: UILabel!

          override func viewDidLoad() {
          super.viewDidLoad()

          let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
          guard let url = URL(string: jsonUrlString) else {return}
          URLSession.shared.dataTask(with: url) { (data, response, err) in
          guard let data = data else {return}

          do {
          let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
          print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
          //let courses = try JSONDecoder().decode([Course].self, from: data)

          DispatchQueue.main.async {
          self.displayLabel.text = websiteDescription.name
          }

          } catch let jsonErr {
          print("Error serializing json", jsonErr)
          }

          }.resume()
          }





          share|improve this answer













          You need to update your label from within the do method. Also you should do it from the main thread so that the UI can be updated. I have updated the code below.



          import UIKit

          struct WebsiteDescription: Decodable {
          var name : String
          var description : String
          var courses : [Course]
          }

          struct Course: Decodable {
          let id: Int
          let name: String
          let link: String
          let imageUrl: String
          }

          class ViewController: UIViewController {

          @IBOutlet weak var displayLabel: UILabel!

          override func viewDidLoad() {
          super.viewDidLoad()

          let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
          guard let url = URL(string: jsonUrlString) else {return}
          URLSession.shared.dataTask(with: url) { (data, response, err) in
          guard let data = data else {return}

          do {
          let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
          print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
          //let courses = try JSONDecoder().decode([Course].self, from: data)

          DispatchQueue.main.async {
          self.displayLabel.text = websiteDescription.name
          }

          } catch let jsonErr {
          print("Error serializing json", jsonErr)
          }

          }.resume()
          }






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 29 '18 at 0:25









          Cedan MisquithCedan Misquith

          27518




          27518













          • This is a lifesaver. Thank you @Cedan!

            – Westopher
            Nov 29 '18 at 1:40






          • 1





            @Westopher: Glad that this answer works for you. Please upvote and accept the answer to acknowledge it.

            – Koen
            Nov 29 '18 at 16:15











          • @Westopher You are welcome. Please upvote and accept this as the answer. Thanks.

            – Cedan Misquith
            Nov 29 '18 at 16:19



















          • This is a lifesaver. Thank you @Cedan!

            – Westopher
            Nov 29 '18 at 1:40






          • 1





            @Westopher: Glad that this answer works for you. Please upvote and accept the answer to acknowledge it.

            – Koen
            Nov 29 '18 at 16:15











          • @Westopher You are welcome. Please upvote and accept this as the answer. Thanks.

            – Cedan Misquith
            Nov 29 '18 at 16:19

















          This is a lifesaver. Thank you @Cedan!

          – Westopher
          Nov 29 '18 at 1:40





          This is a lifesaver. Thank you @Cedan!

          – Westopher
          Nov 29 '18 at 1:40




          1




          1





          @Westopher: Glad that this answer works for you. Please upvote and accept the answer to acknowledge it.

          – Koen
          Nov 29 '18 at 16:15





          @Westopher: Glad that this answer works for you. Please upvote and accept the answer to acknowledge it.

          – Koen
          Nov 29 '18 at 16:15













          @Westopher You are welcome. Please upvote and accept this as the answer. Thanks.

          – Cedan Misquith
          Nov 29 '18 at 16:19





          @Westopher You are welcome. Please upvote and accept this as the answer. Thanks.

          – Cedan Misquith
          Nov 29 '18 at 16:19




















          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%2f53529988%2fdisplay-information-from-decoded-json-in-a-uilabel-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







          Popular posts from this blog

          A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

          Calculate evaluation metrics using cross_val_predict sklearn

          Insert data from modal to MySQL (multiple modal on website)