In this article, we will be creating a simple application that will display data fetched from the JSON file. This app will be demonstrating how to fetch data from JSON files stored in a remote URL and also from the JSON file stored in the App Bundle.
For creating this project, you'll need,
- macOS
- Xcode installed on your Mac
So let’s get started.
Step 1
Open Xcode and create a new project. Select iOS -> Single View App. Name your project and choose the language as Swift. Select the desired location to save your project.
Step 2
Let’s design the UI first. Open Main.storyboard. Let’s embed our View Controller in the Navigation Controller. The Navigation Controller helps us to navigate from one screen to another. To embed the View Controller into Navigation Controller, select Embed In -> Navigation Controller.
Step 3
Next, design the UI as shown in the below image. Connect the outlets of the tableview and segment control on the View Controller. Also, create an Action type outlet for Segment Control.
Step 4
Add delegate and data source for tableview. For this, click on the tableview and clicking the Ctrl button drag it towards the View Controller icon at the top. On releasing the mouse, a black box must appear in a similar manner. Click on ‘delegate’ and ‘dataSource’.
Step 5
Also, name the identifier of the table view cell.
Step 6
Change the titles of the segments by selecting the segment of the Segment Control.
Step 7
Here, we complete the UI Part. Now let’s go to the coding part. Go to File -> New-> File -> Swift. Let’s name the file as Data.swift.
Step 8
Add the following code to this file.
enum Type : Int{
case url = 0
case appBundle = 1
}
Step 9
As you can see, in the above code we have created an Enum which consists of 2 cases. This enum will help the app to identify the segment that the user has chosen.
Step 10
Now, paste the following code into the same file.
struct CountryCodes: Codable {
var name: String
var code: String
}
struct States: Codable {
var state: String
var year: Int
}
Step 11
In the above code, we have created Structs for the respective JSON files that we will be using in our project.
Step 12
Now, create another new Swift file and name it as DataLoader.
Step 13
Copy and paste the following code in DataLoader.swift file.
import Foundation
public class DataLoader {
var countryCodes = [CountryCodes]()
var states = [States]()
init() {
load()
}
func load() {
//url where the JSON file is located
let url = URL(string: "https://gist.githubusercontent.com/krsanu555/6a89cb1aad073a71e869eb19c0c09a5e/raw/bbecb7679c6da7191c86e9d677005496ab6350b7/India-States-And-Its-Formation.json") !
//to fetch data stored in the app bundle file
let fileLocation = Bundle.main.url(forResource: "country-codes", withExtension: "json") !do {
let dataUrl =
try Data(contentsOf: url)
let dataFromAppBundle =
try Data(contentsOf: fileLocation)
let jsonDecoder = JSONDecoder()
let urlDataFromJson =
try jsonDecoder.decode([States].self, from: dataUrl)
let appBundleDataFromJson =
try jsonDecoder.decode([CountryCodes].self, from: dataFromAppBundle)
self.states = urlDataFromJson
self.countryCodes = appBundleDataFromJson
} catch {
print(error)
}
}
}
Step 14
Swift file consists of code to fetch data from a JSON file located in a remote URL as well as from the JSON file that we have stored in our App Bundle.
Step 15
For fetching data from a remote URL, you need to add the link where the JSON file is located. In the above code, you can see a link with a file named ‘India-States-And-Its-Formation.json’. That’s the remote URL that we have used in our code.
Step 16
For fetching data from App Bundle, you need to add the JSON file in the project. Here, I have used the ‘country-codes.json’ file.
Step 17
The JSON data in my ‘country-codes’ file is as shown below,
[{
"name": "Australia",
"code": "AU/AUS"
}, {
"name": "France",
"code": "FR/FRA"
}, {
"name": "India",
"code": "IN/IND"
}, {
"name": "Mexico",
"code": "MX/MEX"
}, {
"name": "New Zealand",
"code": "NZ/NZL"
}, {
"name": "Singapore",
"code": "SG/SGP"
}, {
"name": "Thailand",
"code": "TH/THA"
}, {
"name": "United States",
"code": "US/USA"
}]
Step 18
Add the JSON file into the project by right-clicking on the project folder and choose ‘Add Files to the Project’. Select the JSON file and add it to your project.
Step 19
The JSON file must be visible in the project.
Step 20
Now, go to ViewController.swift file and add the below code,
import UIKit
class ViewController: UIViewController {
@IBOutlet weak
var tableView: UITableView!@IBOutlet weak
var segmentControl: UISegmentedControl!
var type = Type.appBundle
let bundleData = DataLoader().countryCodes
let urlData = DataLoader().states
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func sgmtcntrlChanged(_ sender: Any) {
if segmentControl.selectedSegmentIndex == Type.url.rawValue {
let data = urlData
print(data)
} else {
let data = bundleData
print(data)
}
tableView.reloadData()
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) - > Int {
if segmentControl.selectedSegmentIndex == Type.url.rawValue {
return urlData.count
} else {
return bundleData.count
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) - > UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "data",
for: indexPath)
if segmentControl.selectedSegmentIndex == Type.url.rawValue {
cell.textLabel?.text = urlData[indexPath.row].state
cell.detailTextLabel?.text = String(urlData[indexPath.row].year)
} else {
cell.textLabel?.text = bundleData[indexPath.row].name
cell.detailTextLabel?.text = bundleData[indexPath.row].code
}
return cell
}
}
Step 21
We are done! Run your project and if everything goes well then you must see the below output. You will be able to see the data of JSON files from both URLs as well as App Bundle on the tableview.
Summary
So in this article, we learned how to fetch data from JSON File and display it on the screen.