ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSON 데이터 다루기
    Swift 2020. 12. 23. 14:00

    안녕하세요. 그린입니다!

    이번 포스팅에서는 JSON 파일 데이터를 가져오고 파싱해서 사용하는 방법에 대해 포스팅해보겠습니다~!

     

    우선 간단히 JSON이란 무엇인가 살펴보도록 하죠!

     

    [JSON]

    : JavaScript Object Notation 약자로 키와 쌍으로 이뤄진 데이터 오브젝트를 전달하기 위해 텍스트를 사용한 개방형 표준 포맷

      (key-value), value에는 모든 타입이 들어갈 있지만 보장되는 표현방식에는 문자열과 숫자만 들어갑니다.

     

    컴퓨터는 어떠한 정해진 규칙을 가지고 정보를 전달한다. 기계어,XML,JSON 등이 정보전달 포맷입니다.

    JSON 표현하는 방식에는

    1. {}: 객체 (딕셔너리)
    2. []: 배열
    3. “ “: 문자열
    4. 숫자

    간단하게 데이터를 담을 있다.

     

    JSON Swift에서 사용하기위해서는 Codable이라는 프로토콜을 채택하여야합니다.

    Codable 프로토콜에는 Decodable Encodable 있습니다. ( 디코딩과 인코딩)

    -. Decodable: JSON에서 자신으로 디코딩 (JSON 데이터를 사용하기위함)

    -. Encodable: 자신에서 JSON으로 인코딩 (데이터를 JSON 형식으로 표현하기 위함)

    -. Codable 자신을 변환하거나 외부표현(JSON)으로 변환할 있는 프로토콜이다.

     

    만일 JSON 데이터 변수 이름을 원하는 이름으로 바꿔주고 싶다면 아래와 같이 설정하면됩니다.

    enum CodingKeys: String, CodingKey {
        case title, visitors, location, duration, descriptions
        case titleImageName = "titleImage"
    }
    

     

    CodingKey라는 프로토콜은 인코딩 디코딩을 위한 키로 사용할 있는 타입입니다.

    JSON 데이터를 매칭할 모델 타입을 구현할때는 struct class 가능하지만 보통 struct를 사용하는데 그 이유에 대해 생각해봤습니다.

    struct 타입임으로 참조되거나 상속받지 않는다면 안전하게 사용할 있어 구조체로 구현하는것이 좋을것 같다고 생각합니다.

    또한 구조체에서 클래스로 바꾸는건 쉬워도 클래스에서 구조체로 바꾸는건 어렵습니다. 

     

    [idiom 이란?]

    The device type for the image. For the values, see idiom below. 라고 문서에 설명이 되어있습니다.

    이미지를 위한 기기 타입. 값은 아래 관용구를 보세요. 라고 해석이 되는데 아직 명확하게 관용구라는 용어에 대해 모르겠지만 아마도 보여질 기기 타입을 말하는것 같습니다.

    idiom value에는 프로젝트 다운받은 에셋에도 있는 universal 아니라 아래와 같이 다양하게 존재합니다.

     

    [idiom 여러 value]

    1. appLauncher: An image shown app launcher on watchOS
    2. companionSettings: An image for the Apple Watch Settings app
    3. ios-marketing: An image for the App Store icon
    4. iphone: The image is for iPhone devices.
    5. ipad: The image is for iPad devices.
    6. mac: The image is for Mac computers.
    7. notificationCenter: An image for the notification center on watchOS.
    8. quickLook: An image used for a long look on watchOS.
    9. tv: The image is for Apple TV.
    10. 10) universal: The image works on any device and platform.
    11. 11) watch: The image is for the Apple Watch devices.
    12. 12) watch-marketing: An image for the App Store icon.
    13. 13) Tag not included: Same as specifying universal

    [JSON 파싱과 데이터 사용]

    -. JSON  파싱

    var expositionData: Exposition?

    우선 해당 모델 타입의 인스턴스 변수를 생성

    let jsonDecoder: JSONDecoder = JSONDecoder()
    let dataAssetName: String = “exposition_universelle_1900”
    guard let dataAsset: NSDataAsset = NSDataAsset.init(name: dataAssetName) else { return }
    

    JSONDecoder 객체의 인스턴스 변수를 만들어주고 dataAssetName이라는 변수에 JSON 파일명을 담고 변수로 JSON파일을 불러오도록 하였습니다.

    do {
    	self.expositionData = try jsonDecoder.decode(Exposition.self, from: dataAsset.data)
    	} catch DecodingError.dataCorrupted(let context) {
    		print("데이터가 손상되었거나 유효하지 않습니다.")
    		print(context.codingPath, context.debugDescription, context.underlyingError ?? "" , separator: "\n")
    	} catch DecodingError.keyNotFound(let codingkey, let context) {
    		print("주어진 키를 찾을수 없습니다.")
    		print(codingkey.intValue ?? Optional(nil)! , codingkey.stringValue , context.codingPath, context.debugDescription, context.underlyingError ?? "" , separator: "\n")
    	} catch DecodingError.typeMismatch(let type, let context) {
    		print("주어진 타입과 일치하지 않습니다.")
    		print(type.self , context.codingPath, context.debugDescription, context.underlyingError ?? "" , separator: "\n")
    	} catch DecodingError.valueNotFound(let type, let context) {
    		print("예상하지 않은 null 값이 발견되었습니다.")
    		print(type.self , context.codingPath, context.debugDescription, context.underlyingError ?? "" , separator: "\n")
    	} catch {
    		print("그외 에러가 발생했습니다.")
    	}
    

    디코딩을하는 과정에서 여러 에러 상황들을 catch 있도록 구성하였습니다.

    디코딩된 JSON 데이터를 이제 아래와 같이 사용해봤습니다.

     

    -. JSON 데이터 사용

    titleTextLabel.text = data.title
    titleImageView.image = data.titleImage
    visitorsTextLabel.text = numberOfVisitors
    locationTextLabel.text = data.expositionLocation
    durationTextLabel.text = data.expositionDuration
    descriptionTextLabel.text = data.description

    이렇게 어렵지 않게 JSON 파일 데이터를 파싱하고 데이터를 사용해보았습니다.

     

    JSON 파일의 키를 통해 접근하고 사용한다고 생각하면 쉬울겁니다.

    이렇게 오늘 JSON 파일과 데이터를 다뤄봤습니다~!!

    굉장히 중요한 부분중 하나임으로 꼭 마스터를 하고 가도록 더 노력해야겠습니다..!

    감사합니다 :D

    'Swift' 카테고리의 다른 글

    Concurrent Programming  (0) 2021.01.07
    인스턴스 생성 및 소멸  (0) 2020.12.28
    고차함수와 함수형 프로그래밍  (0) 2020.12.18
    제네릭  (0) 2020.12.13
    프로토콜/구조체/클래스에 관하여  (0) 2020.11.23
Designed by Tistory.