2015-10-17 29 views
8

Tôi đã tạo một struct và muốn lưu nó dưới dạng tệp JSON.Swift: Chuyển đổi cấu trúc thành JSON?

struct Sentence { 
    var sentence = "" 
    var lang = "" 
} 

var s = Sentence() 
s.sentence = "Hello world" 
s.lang = "en" 
print(s) 

... mà kết quả trong:

Sentence(sentence: "Hello world", lang: "en") 

Nhưng làm thế nào tôi có thể chuyển đổi các đối tượng struct một cái gì đó như:

{ 
    "sentence": "Hello world", 
    "lang": "en" 
} 
+1

có thể trùng lặp của [Chuyển đổi từ điển để JSON trong Swift] (http://stackoverflow.com/questions/29625133/convert-dictionary-to-json-in-s wift) (như một gợi ý, bạn chỉ có thể chuyển đổi một mảng hoặc từ điển thành JSON, vì vậy về cơ bản bạn cần một biểu diễn từ điển của giá trị bạn muốn đặt ở định dạng JSON). – nhgrif

+0

Về cơ bản, nó sẽ là tuyệt vời nếu tôi có thể chuyển đổi cấu trúc thành một chuỗi giống như json. Khi chỉ mảng và từ điển có thể chuyển đổi thành JSON, câu hỏi của tôi là: Làm cách nào để chuyển đổi cấu trúc thành từ điển? – ixany

+0

Có các thư viện của bên thứ ba như https://github.com/Hearst-DD/ObjectMapper. Tôi không có kinh nghiệm với điều đó, tuy nhiên. –

Trả lời

9

Bạn có thể thêm thuộc tính được tính để nhận biểu diễn JSON và hàm tĩnh (lớp) để tạo mảng JSON từ mảng Sentence.

struct Sentence { 
    var sentence = "" 
    var lang = "" 

    static func jsonArray(array : [Sentence]) -> String 
    { 
    return "[" + array.map {$0.jsonRepresentation}.joinWithSeparator(",") + "]" 
    } 

    var jsonRepresentation : String { 
    return "{\"sentence\":\"\(sentence)\",\"lang\":\"\(lang)\"}" 
    } 
} 


let sentences = [Sentence(sentence: "Hello world", lang: "en"), Sentence(sentence: "Hallo Welt", lang: "de")] 
let jsonArray = Sentence.jsonArray(sentences) 
print(jsonArray) // [{"sentence":"Hello world","lang":"en"},{"sentence":"Hallo Welt","lang":"de"}] 
+0

Làm cách nào chúng tôi có thể hoàn nguyên nó thành cấu trúc? –

+0

@BhavinRamani Thêm init khởi tạo (dict: [String: Any]) {... 'và trích xuất các giá trị – vadian

11

Sử dụng NSJSONSerialization class.

Sử dụng tính năng này cho reference, bạn có thể cần tạo hàm trả về chuỗi được tuần tự hóa JSON. Trong hàm này, bạn có thể lấy các thuộc tính bắt buộc và tạo một NSDictionary từ chúng và sử dụng lớp được đề cập ở trên.

Something như thế này:

struct Sentence { 
    var sentence = "" 
    var lang = "" 

    func toJSON() -> String? { 
     let props = ["Sentence": self.sentence, "lang": lang] 
     do { 
      let jsonData = try NSJSONSerialization.dataWithJSONObject(props, 
      options: .PrettyPrinted) 
      return String(data: jsonData, encoding: NSUTF8StringEncoding) 
     } catch let error { 
      print("error converting to json: \(error)") 
      return nil 
     } 
    } 

} 

Bởi vì struct của bạn chỉ có hai thuộc tính nó có thể được dễ dàng hơn để chỉ cần xây dựng chuỗi JSON chính mình.

+0

Nó hoạt động tốt. –

+0

Trả về 'toJSON()' phải là 'NSData'. Ngoài ra, khóa thứ hai trong từ điển 'props' bạn đã tạo là sai. – nhgrif

+0

Tôi đã cập nhật khóa thứ hai thành chuỗi, cảm ơn. Điểm thứ hai phụ thuộc vào những gì người dùng muốn quay trở lại – Scriptable

2

Swift 4 hỗ trợ giao thức Encodable ví dụ:

struct Sentence: Encodable { 
    var sentence: String? 
    var lang: String? 
} 

let sentence = Sentence(sentence: "Hello world", lang: "en") 

Bây giờ bạn có thể tự động chuyển đổi Struct của bạn vào JSON sử dụng một JSONEncoder:

let jsonEncoder = JSONEncoder() 
let jsonData = try jsonEncoder.encode(sentence) 

In nó ra:

let jsonString = String(data: jsonData, encoding: .utf8) 
print(jsonString) 

{ 
    "sentence": "Hello world", 
    "lang": "en" 
} 

https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

Các vấn đề liên quan