programing

Swift에서의 객체 자동 JSON 시리얼화 및 역직렬화

megabox 2023. 3. 20. 21:46
반응형

Swift에서의 객체 자동 JSON 시리얼화 및 역직렬화

Swift에서 클래스 인스턴스를 자동으로 직렬화 및 역직렬화하는 방법을 찾고 있습니다.다음 클래스를 정의했다고 가정해 보겠습니다.

class Person {
    let firstName: String
    let lastName: String

    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }
}

……의사Person★★★★★★★★★★★★★★★★★★:

let person = Person(firstName: "John", lastName: "Doe")

'JSON'의 JSON person음음음같 뭇매하다

{
    "firstName": "John",
    "lastName": "Doe"
}

자, 여기 질문이 있습니다.

  1. 할 수 요?personJSON으로 변환되는 사전에 클래스의 모든 속성을 수동으로 추가할 필요 없이 위의 JSON을 얻을 수 있습니다.
  2. JSON 해야 ?Person다시 말씀드리지만 속성을 수동으로 매핑하고 싶지 않습니다.

C#에서 Json을 사용하는 방법은 다음과 같습니다.네트워크:

var person = new Person("John", "Doe");
string json = JsonConvert.SerializeObject(person);
// {"firstName":"John","lastName":"Doe"}

Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json);

WWDC2017 @ 24:48 (Swift 4)에서 알 수 있듯이 Codable 프로토콜을 사용할 수 있습니다.

public struct Person : Codable {
   public let firstName:String
   public let lastName:String
   public let location:Location
}

시리얼화하다

let payload: Data = try JSONEncoder().encode(person)

역직렬화하다

let anotherPerson = try JSONDecoder().decode(Person.self, from: payload)

모든 속성은 Codable 프로토콜을 준수해야 합니다.

스웨거의 코드 생성기에서 사용하는 JSONCodable사용할 수도 있습니다.

EVReflection을 사용할 수 있습니다.다음과 같은 코드를 사용할 수 있습니다.

var person:Person = Person(json:jsonString)

또는

var jsonString:String = person.toJsonString()

자세한 샘플 코드는 GitHub 페이지를 참조하십시오.EVObject를 데이터 개체의 기본 클래스로만 만들면 됩니다.매핑이 필요하지 않습니다(json 키가 속성 이름과 동일한 경우).

업데이트: Swift 4는 코드블을 지원하므로 EVReflection과 거의 비슷하게 쉽게 선택할 수 있지만 성능이 향상됩니다.위와 같이 쉬운 계약자를 사용하는 경우 다음 내선번호를 사용할 수 있습니다.물건/코드 가능

에서는 Swift 4에 따라 .Codable )Encodable ★★★★★★★★★★★★★★★★★」DecodableJSON j j j j j j j j j j j j j j j j j j j j j.

import Foundation

class Person: Codable {
    let firstName: String
    let lastName: String

    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }
}

a '1(a)')Person"JSON" (JSON) :

let person = Person(firstName: "John", lastName: "Doe")
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // if necessary
let data = try! encoder.encode(person)
let jsonString = String(data: data, encoding: .utf8)!
print(jsonString)

/*
 prints:
 {
   "firstName" : "John",
   "lastName" : "Doe"
 }
 */

을 "#2"(JSON ")로 )Person★★★★★★★★★★★★★★★★★★:

let jsonString = """
{
  "firstName" : "John",
  "lastName" : "Doe"
}
"""

let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()
let person = try! decoder.decode(Person.self, from: jsonData)
dump(person)

/*
 prints:
 ▿ __lldb_expr_609.Person #0
   - firstName: "John"
   - lastName: "Doe"
 */

이라는 파운데이션 요.NSJSONSerialization do which which which which 。JSON.

JSON에서 객체로 변환하는 방법은 다음과 같습니다.

let jsonObject = NSJSONSerialization.JSONObjectWithData(data, 
    options: NSJSONReadingOptions.MutableContainers, 
    error: &error) as NSDictionary

의 첫 는 " " 입니다.JSON로서가 아니라 string 「」로서 NSDataJSON(JSON)

대부분의 경우 JSON 데이터를 인수로 사용하여 클래스의 초기화 개체를 반환하는 공장 메서드가 필요합니다.

이 프로세스를 역방향으로 하여 객체로부터 JSON 데이터를 작성하려면 , 다음을 사용할 필요가 있습니다.dataWithJSONObjectJSON으로 변환할 수 있는 오브젝트를 전달하여NSData?반환했다.이 경우에도 인수가 필요 없는 도우미 메서드를 클래스의 인스턴스 메서드로 만들 수 있습니다.


제가 알기로는 가장 쉬운 방법은 오브젝트 속성을 사전에 매핑하는 방법을 만들고 그 사전을 전달하여 오브젝트를 JSON 데이터로 변환하는 것입니다.그런 다음 JSON 데이터를 개체로 변환할 때 사전이 반환되어 매핑 프로세스를 반대로 진행해야 합니다.하지만 더 쉬운 방법이 있을지도 몰라.

ObjectMapper 라이브러리를 사용하면 이 작업을 수행할 수 있습니다.변수 이름, 값 및 준비된 JSON을 더 잘 제어할 수 있습니다.이 라이브러리를 추가한 후Mappable클래스 및 정의mapping(map: Map)기능.

예를들면

   class User: Mappable {
       var id: Int?
       var name: String?

       required init?(_ map: Map) {

       }

       // Mapping code
       func mapping(map: Map) {
          name    <- map["name"]
          id      <- map["id"]
       }

    }

아래와 같이 사용하다

   let user = Mapper<User>().map(JSONString)

먼저 이와 같은 Swift 개체를 만듭니다.

struct Person {
    var firstName: String?;
    var lastName: String?;
    init() {

    }
}

그런 다음 내장된 NSJON Serialization을 사용하여 가져온 JSON 데이터를 직렬화하고 값을 Person 개체로 구문 분석합니다.

var person = Person();
var error: NSError?;
var response: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(), error: &error);

if let personDictionary = response as? NSDictionary {
    person.firstName = personDictionary["firstName"] as? String;
    person.lastName = personDictionary["lastName"] as? String;
}

갱신:

그리고 그 도서관들을 봐주세요.

Swift-Json Serialiser

ROJSONParser(로드파서)

NSKeyValueCoding.h에 대해 자세히 설명합니다.setValuesForKeysWithDictionaryjson을 디시리얼화하면NSDictionary그러면 해당 딕셔너리 인스턴스를 사용하여 개체를 만들고 초기화할 수 있습니다.개체에 값을 수동으로 설정할 필요가 없습니다.이것에 의해, 역직렬화가 json과 어떻게 기능할 수 있는지를 알 수 있습니다만, 곧 역직렬화 프로세스에 대한 제어가 필요하게 됩니다.이 때문에, 다음의 카테고리를 실장하고 있습니다.NSObject완전히 통제될 수긍할 수 있는NSObjectjson deserialization 동안 사전으로 초기화, 기본적으로 오브젝트를 더욱 풍부하게 합니다.setValuesForKeysWithDictionary할 수 있어요.또한 json deserializer에 의해 사용되는 프로토콜도 있습니다.이 프로토콜은 예를 들어 NSAray를 역직렬화하는 경우 어레이에 저장된 객체의 유형 이름을 해당 객체에 묻습니다.

언급URL : https://stackoverflow.com/questions/26820720/automatic-json-serialization-and-deserialization-of-objects-in-swift

반응형