EVReflection: easier way to parse JSON

JSON 해석은 앱을 개발할 때 자주 만나는 수요이다. 대부분의 인터넷 요청의 반환 데이터는 JSON의 형식이기 때문에 JSON이 해석한 코드를 수동으로 쓰는 것은 시간이 걸리고 추악한 코드를 많이 쓴다.EVReflection은 더욱 우아하고 간단한 JSON 해석 방식을 제공했다
사용 소개
EVReflection은 자동으로 EVObject에 맞는 클래스를 JSON에서 반서열화할 수 있습니다. 우선 자신의 모델 클래스가 EVObject를 계승해야 합니다.
class User: EVObject {
    var id: Int = 0
    var name: String = ""
    var friends: [User]? = []
}

단일 객체의 반서열화

    let json:String = "{\"id\": 24, \"name\": \"Bob Jefferson\", \"friends\": [{\"id\": 29, \"name\": \"Jen Jackson\"}]}"
    let user = User(json: json)

배열의 반서열화

    let json:String = "[{\"id\": 27, \"name\": \"Bob Jefferson\"}, {\"id\": 29, \"name\": \"Jen Jackson\"}]"
    let array = [User](json: json)

Demo
다음은 찹쌀망 도시 리스트를 획득한 데모를 통해 EVReflection의 사용법을 알아보겠습니다.
의존성 추가
여기서 우리는 코코아팟을 통해 의존을 관리한다
pod 'EVReflection'
pod 'Alamofire'

ServiceProxy 클래스
우선 ServiceProxy 클래스를 새로 만들고 네트워크 요청 부분 코드를 넣습니다
import Foundation
import EVReflection
import Alamofire
class ServiceProxy{
    // MARK: -URL
    static var ServiceEndpointBase : String {
        return "http://apis.baidu.com/baidunuomi/openapi/cities"
    }
    class func getCityList (complete:(response: AnyObject?, error: NSError?) -> Void){
        
        Alamofire.request(.GET, ServiceEndpointBase, parameters: parameters, encoding: .URL, headers: ["apikey":"ownAPIKey"]).validate(statusCode: 200..<300).responseJSON { (response:Response) -> Void in
            print(response.result.value!)
            complete(response: response.result.value, error: response.result.error)
        } 
    }
}

분석 JSON
우리 먼저 결과를 프린트하고 JSON을 분석해 봅시다.
{
    cities =     (
                {
            "city_id" = 100010000;
            "city_name" = "\U5317\U4eac\U5e02";
            "city_pinyin" = beijing;
            "short_name" = "\U5317\U4eac";
            "short_pinyin" = bj;
        },
                {
            "city_id" = 500010000;
            "city_name" = "\U5929\U6d25\U5e02";
            "city_pinyin" = tianjin;
            "short_name" = "\U5929\U6d25";
            "short_pinyin" = tj;
        },
                {
            "city_id" = 1800010000;
            "city_name" = "\U77f3\U5bb6\U5e84\U5e02";
            "city_pinyin" = shijiazhuang;
            "short_name" = "\U77f3\U5bb6\U5e84";
            "short_pinyin" = sjz;
        },
                {
            "city_id" = 1800020000;
            "city_name" = "\U5510\U5c71\U5e02";
            "city_pinyin" = tangshan;
            "short_name" = "\U5510\U5c71";
            "short_pinyin" = ts;
        },
                {
            "city_id" = 1800030000;
            "city_name" = "\U79e6\U7687\U5c9b\U5e02";
            "city_pinyin" = qinhuangdao;
            "short_name" = "\U79e6\U7687\U5c9b";
            "short_pinyin" = qhd;
        },
                {
            "city_id" = 1800040000;
            "city_name" = "\U90af\U90f8\U5e02";
            "city_pinyin" = handan;
            "short_name" = "\U90af\U90f8";
            "short_pinyin" = hd;
        },
                {
            "city_id" = 1800050000;
            "city_name" = "\U90a2\U53f0\U5e02";
            "city_pinyin" = xingtai;
            "short_name" = "\U90a2\U53f0";
            "short_pinyin" = xt;
        },
                {
            "city_id" = 1800060000;
            "city_name" = "\U4fdd\U5b9a\U5e02";
            "city_pinyin" = baoding;
            "short_name" = "\U4fdd\U5b9a";
            "short_pinyin" = bd;
        },
                {
            "city_id" = 1800070000;
            "city_name" = "\U5f20\U5bb6\U53e3\U5e02";
            "city_pinyin" = zhangjiakou;
            "short_name" = "\U5f20\U5bb6\U53e3";
            "short_pinyin" = zjk;
        },
                {
            "city_id" = 1800080000;
            "city_name" = "\U627f\U5fb7\U5e02";
            "city_pinyin" = chengde;
            "short_name" = "\U627f\U5fb7";
            "short_pinyin" = chengde;
        },
                {
            "city_id" = 1800090000;
            "city_name" = "\U6ca7\U5dde\U5e02";
            "city_pinyin" = cangzhou;
            "short_name" = "\U6ca7\U5dde";
            "short_pinyin" = cangzhou;
        },
                {
            "city_id" = 1800100000;
            "city_name" = "\U5eca\U574a\U5e02";
            "city_pinyin" = langfang;
            "short_name" = "\U5eca\U574a";
            "short_pinyin" = lf;
        }
        ......
    );
    errno = 0;
    msg = success;
}

모델 클래스 생성
다음에 모델들을 쓸 때 주의해야 할 것은 우리가 정의한 데이터 클래스는 반드시 EVObject를 계승해야 한다는 것이다
import Foundation
import EVReflection
class CityModel:EVObject{
    var city_name = ""
    var city_pinyin = ""
    var short_name = ""
    var short_pinyin = ""
    var city_id = 100010000
}

테스트 결과
마지막으로viewDidLoad 방법에서 도시 목록의 획득 상황을 테스트해 보겠습니다.
JSON 유형은 SwiftyJSON에서 제공
    ServiceProxy.getCityList({ (response, error) -> Void in
            let array = [CityModel](json: JSON(response!)["cities"].rawString())
            print(array)
    })

마지막으로 얻은 데이터의 결과는 다음과 같다
CityModel {
   hash = -1349730932489599961
   key = short_name, value =   
   key = city_pinyin, value = leping
   key = city_name, value =    
   key = short_pinyin, value = leping
   key = city_id, value = 2400130000
}

좋은 웹페이지 즐겨찾기