2017-11-04 3 views
0

다음은 완벽한 Json을 얻는 코드입니다.스위프트 4 Json 인코딩 및 디코딩

var str = "Hello" 
var dictionary = ["key1":"val1", "key2":"val2", "key3":"val3"] 

var products = [Product]() 

struct Product: Codable { 
    var title: String 
    var reference: String 
} 

func createProducts(title: String, refer: String) { 
    products.append(Product(title: title, reference: refer)) 
} 

for element in dictionary { 
    createProducts(title: element.key, refer: element.value) 
} 

var general = [str: products] 

let encodedData = try? JSONEncoder().encode(general) 
let json = String(data: encodedData!, encoding: .utf8)! 
print(json) 

My Json dict는 다음과 같습니다.

{"Hello":[{"title":"key2","reference":"val2"},{"title":"key3","reference":"val3"},{"title":"key1","reference":"val1"}]} 

그리고 Json의 디코딩 후,이 부분 만 가져야합니다.

[{"title":"key2","reference":"val2"},{"title":"key3","reference":"val3"},{"title":"key1","reference":"val1"}] 

"Hello"값을 얻으려면 아래의 디코더에서 문제가 있습니다.

if let decodedData = try! JSONDecoder().decode(general.self, from: json.data(using: .utf8)!) { 
    print(decodedData) 
} 

답변

2

인코딩 된 JSON의 실제 유형 [String:[Product]] 정도로 그 디코딩 대안 우산을 Root 구조체

struct Root : Decodable { 
    private enum CodingKeys : String, CodingKey { case hello = "Hello" } 
    let hello : [Product] 
} 

을 만들 Hello

do { 
    let decodedData = try JSONDecoder().decode([String:[Product]].self, from: Data(json.utf8)) 
    print(decodedData["Hello"]!) 
} catch { 
    print(error) 
} 

의 값을 얻을 디코딩된다

do { 
    let decodedData = try JSONDecoder().decode(Root.self, from: Data(json.utf8)) 
    print(decodedData.hello)