[ios] 신속하게 JSON 파일을 구문 분석하는 방법은 무엇입니까?

JSON 파일이 있고 테이블보기에서 개체 목록을 구문 분석하고 사용하고 싶습니다. 누구든지 신속하게 JSON 파일을 구문 분석하는 코드를 공유 할 수 있습니다.



답변

더 간단 할 수 없습니다.

import Foundation

let jsonData: Data = /* get your json data */
let jsonDict = try JSONSerialization.jsonObject(with: jsonData) as? NSDictionary

즉, Swift 4에 도입 된 Codable API를 사용하는 것이 좋습니다 .


답변

API 요청 만들기

var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)

응답 준비

아래와 같이 배열 선언

var data: NSMutableData = NSMutableData()

응답 받기

1.

func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
   // Received a new request, clear out the data object
   self.data = NSMutableData()
}

2.

func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
   // Append the received chunk of data to our data object
   self.data.appendData(data)
}

삼.

func connectionDidFinishLoading(connection: NSURLConnection!) {
   // Request complete, self.data should now hold the resulting info
   // Convert the retrieved data in to an object through JSON deserialization
   var err: NSError
   var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

   if jsonResult.count>0 && jsonResult["results"].count>0 {
      var results: NSArray = jsonResult["results"] as NSArray
      self.tableData = results
      self.appsTableView.reloadData()

   }
}

NSURLConnection응답을 수신, 우리가 기대할 수있는 didReceiveResponse방법은 우리를 대신하여 호출 할 수 있습니다. 이 시점에서 우리는 단순히 self.data = NSMutableData()새로운 빈 데이터 객체를 생성하여 데이터를 재설정 합니다.

연결이 완료되면 메소드에서 데이터 수신을 시작합니다 didReceiveData. 여기에 전달되는 데이터 인수는 모든 육즙 정보의 출처입니다. 들어오는 각 청크를 유지해야하므로 이전에 지운 self.data 개체에 추가합니다.

마지막으로 연결이 완료되고 모든 데이터가 수신되면를 connectionDidFinishLoading호출하고 앱에서 데이터를 사용할 준비가 된 것입니다. 만세!

여기서 connectionDidFinishLoading메서드는 Url의 결과를 역 직렬화하여 NSJSONSerialization원시 데이터를 유용한 Dictionary개체 로 변환 하는 클래스를 사용합니다 .


답변

방금 JSON이라는 클래스를 작성하여 Swift에서 JSON을 ES5의 JSON 개체처럼 쉽게 처리 할 수 ​​있습니다.

다음과 같이 신속한 객체를 JSON으로 변환하십시오.

let obj:[String:AnyObject] = [
    "array": [JSON.null, false, 0, "",[],[:]],
    "object":[
        "null":   JSON.null,
        "bool":   true,
        "int":    42,
        "double": 3.141592653589793,
        "string": "a α\t弾\n?",
        "array":  [],
        "object": [:]
    ],
    "url":"http://blog.livedoor.com/dankogai/"
]

let json = JSON(obj)
json.toString()

… 또는 문자열 …

let json = JSON.parse("{\"array\":[...}")

… 또는 URL.

let json = JSON.fromURL("http://api.dan.co.jp/jsonenv")
Tree Traversal

아래 첨자를 통해 요소를 탐색하면됩니다.

json["object"]["null"].asNull       // NSNull()
// ...
json["object"]["string"].asString   // "a α\t弾\n?"
json["array"][0].asNull             // NSNull()
json["array"][1].asBool             // false
// ...

SwiftyJSON 과 마찬가지로 첨자 항목이 존재하지 않아도 걱정할 필요가 없습니다.

if let b = json["noexistent"][1234567890]["entry"].asBool {
    // ....
} else {
    let e = json["noexistent"][1234567890]["entry"].asError
    println(e)
}

아래 첨자에 지쳤다면 다음과 같이 구성표를 추가하십시오.

//// schema by subclassing
class MyJSON : JSON {
    init(_ obj:AnyObject){ super.init(obj) }
    init(_ json:JSON)  { super.init(json) }
    var null  :NSNull? { return self["null"].asNull }
    var bool  :Bool?   { return self["bool"].asBool }
    var int   :Int?    { return self["int"].asInt }
    var double:Double? { return self["double"].asDouble }
    var string:String? { return self["string"].asString }
}

그리고 당신은 간다 :

let myjson = MyJSON(obj)
myjson.object.null
myjson.object.bool
myjson.object.int
myjson.object.double
myjson.object.string
// ...

네가 좋아하길 바래.

새로운 xCode 7.3+에서는 도메인을 예외 목록에 추가하는 것이 중요합니다 ( 내 info.plist 파일에 NSAppTransportSecurity를 ​​어떻게 추가 할 수 있습니까? ). 지침은이 게시물을 참조하십시오. 그렇지 않으면 전송 기관 오류가 발생합니다.


답변

다음은 Swift 2.0에서 JSON과 NSData를 변환하는 코드입니다.

// Convert from NSData to json object
func nsdataToJSON(data: NSData) -> AnyObject? {
    do {
        return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
    } catch let myJSONError {
        print(myJSONError)
    }
    return nil
}

// Convert from JSON to nsdata
func jsonToNSData(json: AnyObject) -> NSData?{
    do {
        return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
    } catch let myJSONError {
        print(myJSONError)
    }
    return nil;
}


답변

코딩 가능

스위프트 년 4 + 강력하게 사용하는 것이 좋습니다 Codable대신 JSONSerialization.

여기 Codable에는 DecodableEncodable. 이 Decodable프로토콜을 사용하면 DataJSON 형식으로이 프로토콜을 준수하는 사용자 지정 구조체 / 클래스 로 디코딩 할 수 있습니다 .

예를 들어 다음과 같은 간단한 상황을 상상해보십시오 Data(두 개체의 배열).

let data = Data("""
[
    {"name":"Steve","age":56},
    {"name":"iPhone","age":11}
]
""".utf8)

그런 다음 struct프로토콜 을 따르고 구현하십시오.Decodable

struct Person: Decodable {
    let name: String
    let age: Int
}

이제 첫 번째 매개 변수가 유형을 준수 하고이 유형을 디코딩 해야하는 사용 Data배열 로 디코딩 할 수 있습니다.PersonJSONDecoderDecodableData

do {
    let people = try JSONDecoder().decode([Person].self, from: data)
} catch { print(error) }

try예를 들어 이름 지정에 약간의 실수를하여 모델을 올바르게 디코딩 할 수 없기 때문에 디코딩 은 키워드 로 표시 되어야합니다.


json의 키가 속성 이름과 다른 경우 :

  • 키에 snake_case을 사용하여 명명 된 경우의 디코더 설정할 수 있습니다 keyDecodingStrategyconvertFromSnakeCase에서 키를 변경하는 property_name낙타 표기법에propertyName

    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let people = try decoder.decode([Person].self, from: data)
    
  • 고유 한 이름이 필요한 경우 이름을 선언하는 구조체 / 클래스 내에서 코딩 키를 사용할 수 있습니다.

    let data = Data("""
    { "userName":"Codable", "age": 1 }
    """.utf8)
    
    struct Person: Decodable {
    
        let name: String
        let age: Int
    
        enum CodingKeys: String, CodingKey {
            case name = "userName"
            case age
        }
    }
    


답변

또한 json 응답을 객체 구조로 매핑하는 데 특화된 작은 라이브러리를 작성했습니다. 내부적으로 David Owens의 json-swift 라이브러리를 사용하고 있습니다. 다른 사람에게 유용 할 수도 있습니다.

https://github.com/prine/ROJSONParser

Employees.json

{
"employees": [
  {
    "firstName": "John",
    "lastName": "Doe",
    "age": 26
  },
  {
    "firstName": "Anna",
    "lastName": "Smith",
    "age": 30
  },
  {
    "firstName": "Peter",
    "lastName": "Jones",
    "age": 45
  }]
}

다음 단계로 데이터 모델 (EmplyoeeContainer 및 Employee)을 생성해야합니다.

Employee.swift

class Employee : ROJSONObject {

    required init() {
        super.init();
    }

    required init(jsonData:AnyObject) {
        super.init(jsonData: jsonData)
    }

    var firstname:String {
        return Value<String>.get(self, key: "firstName")
    }

    var lastname:String {
        return Value<String>.get(self, key: "lastName")
    }

    var age:Int {
        return Value<Int>.get(self, key: "age")
    }
}

EmployeeContainer.swift

class EmployeeContainer : ROJSONObject {
    required init() {
        super.init();
    }

    required init(jsonData:AnyObject) {
        super.init(jsonData: jsonData)
    }

    lazy var employees:[Employee] = {
        return Value<[Employee]>.getArray(self, key: "employees") as [Employee]
    }()
}

그런 다음 실제로 JSON 응답의 객체를 매핑하려면 생성자의 매개 변수로 EmployeeContainer 클래스에 데이터를 전달하기 만하면됩니다. 데이터 모델을 자동으로 생성합니다.

 var baseWebservice:BaseWebservice = BaseWebservice();

  var urlToJSON = "http://prine.ch/employees.json"

  var callbackJSON = {(status:Int, employeeContainer:EmployeeContainer) -> () in
    for employee in employeeContainer.employees {
      println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)")
    }
  }

  baseWebservice.get(urlToJSON, callback:callbackJSON)

콘솔 출력은 다음과 같습니다.

Firstname: John Lastname: Doe age: 26
Firstname: Anna Lastname: Smith age: 30
Firstname: Peter Lastname: Jones age: 45


답변

SwiftJSONParse : 멍청한 것처럼 JSON 구문 분석

아주 간단하고 읽기 쉽습니다!

예 : 값을 얻을 "mrap"에서 nicknames이 JSON 응답에서 문자열로

{
    "other": {
        "nicknames": ["mrap", "Mikee"]
}

json 데이터를 NSData그대로 사용하므로 사전 처리 할 필요가 없습니다.

let parser = JSONParser(jsonData)

if let handle = parser.getString("other.nicknames[0]") {
    // that's it!
}

면책 조항 : 나는 이것을 만들었고 그것이 모두에게 도움이되기를 바랍니다. 자유롭게 개선하십시오!