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"
}
자, 여기 질문이 있습니다.
- 할 수 요?
person
JSON으로 변환되는 사전에 클래스의 모든 속성을 수동으로 추가할 필요 없이 위의 JSON을 얻을 수 있습니다. - 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
★★★★★★★★★★★★★★★★★」Decodable
JSON 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 「」로서 NSData
JSON(JSON)
대부분의 경우 JSON 데이터를 인수로 사용하여 클래스의 초기화 개체를 반환하는 공장 메서드가 필요합니다.
이 프로세스를 역방향으로 하여 객체로부터 JSON 데이터를 작성하려면 , 다음을 사용할 필요가 있습니다.dataWithJSONObject
JSON으로 변환할 수 있는 오브젝트를 전달하여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;
}
갱신:
그리고 그 도서관들을 봐주세요.
NSKeyValueCoding.h에 대해 자세히 설명합니다.setValuesForKeysWithDictionary
json을 디시리얼화하면NSDictionary
그러면 해당 딕셔너리 인스턴스를 사용하여 개체를 만들고 초기화할 수 있습니다.개체에 값을 수동으로 설정할 필요가 없습니다.이것에 의해, 역직렬화가 json과 어떻게 기능할 수 있는지를 알 수 있습니다만, 곧 역직렬화 프로세스에 대한 제어가 필요하게 됩니다.이 때문에, 다음의 카테고리를 실장하고 있습니다.NSObject
완전히 통제될 수긍할 수 있는NSObject
json deserialization 동안 사전으로 초기화, 기본적으로 오브젝트를 더욱 풍부하게 합니다.setValuesForKeysWithDictionary
할 수 있어요.또한 json deserializer에 의해 사용되는 프로토콜도 있습니다.이 프로토콜은 예를 들어 NSAray를 역직렬화하는 경우 어레이에 저장된 객체의 유형 이름을 해당 객체에 묻습니다.
언급URL : https://stackoverflow.com/questions/26820720/automatic-json-serialization-and-deserialization-of-objects-in-swift
'programing' 카테고리의 다른 글
js-file Wordpress 내의 php (0) | 2023.03.20 |
---|---|
가져오기 vs.Ajax Call (0) | 2023.03.20 |
WordPress: enqueue를 사용하여 여러 스크립트 로드 (0) | 2023.03.20 |
리액트 리플릿 맵이 올바르게 표시되지 않음 (0) | 2023.03.20 |
HttpClient에서 JSON 문자열을 해석하려면 어떻게 해야 하나요? (0) | 2023.03.15 |