2015-10-17 10 views
8

Utworzono plik struct i chcę go zapisać jako plik JSON.Swift: Konwertuj struct na JSON?

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

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

... co skutkuje:

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

Ale jak mogę przekonwertować obiekt struct do czegoś podobnego:

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

Możliwy duplikat [Konwersja słownika do JSON w Swift] (http://stackoverflow.com/questions/29625133/convert-dictionary-to-json-in-s wift) (jako podpowiedź, możesz konwertować tylko tablicę lub słownik do JSON, więc w zasadzie potrzebujesz słownikowej reprezentacji wartości, którą chcesz umieścić w formacie JSON). – nhgrif

+0

Zasadniczo byłoby świetnie, gdybym mógł przekonwertować strukturę na ciąg podobny do json. Kiedy tylko tablice i słowniki można konwertować na JSON, moje pytanie brzmi: Jak przekonwertować strukturę do słownika? – ixany

+0

Istnieją zewnętrzne biblioteki, takie jak https://github.com/Hearst-DD/ObjectMapper. Jednak nie mam z tym żadnego doświadczenia. –

Odpowiedz

9

Można dodać obliczoną właściwość, aby uzyskać reprezentację JSON i funkcję statyczną (klasę), aby utworzyć tablicę JSON z tablicy 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

Jak możemy go przekonwertować na struct? –

+0

@BhavinRamani Dodaj inicjator init (dict: [String: Any]) {... 'i wyodrębnij wartości – vadian

11

Użyj NSJSONSerialization class.

Użycie tego dla reference, może być konieczne utworzenie funkcji, która zwraca ciąg szeregowy JSON. W tej funkcji możesz pobrać wymagane właściwości i utworzyć NSDictionary z nich i użyć klasy wspomnianej powyżej.

coś takiego:

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 
     } 
    } 

} 

Ponieważ struktura ma tylko dwie właściwości może być łatwiej po prostu zbudować ciąg JSON siebie.

+0

Działa dobrze. –

+0

Powrót 'toJSON()' powinno być 'NSData'. Również drugi klucz w słowniku "props", który utworzyłeś, jest błędny. – nhgrif

+0

Zaktualizowałem drugi klucz, aby był ciągiem znaków, dziękuję. Drugi punkt zależy od tego, co użytkownik chce odzyskać. – Scriptable

2

Swift 4 obsługuje protokół przykład kodowane

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

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

Teraz można automatycznie przekonwertować struct do JSON przy użyciu JSONEncoder:

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

wydrukować go:

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