Swift: Convert struct to JSON?

后端 未结 3 1697
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-03 17:20

I created a struct and want to save it as a JSON-file.

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

var s = Sentence()
s.sen         


        
相关标签:
3条回答
  • 2020-12-03 17:34

    You could add a computed property to get the JSON representation and a static (class) function to create an JSON array from a Sentence array.

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

    Edit:

    Swift 4 introduces the Codable protocol which provides a very convenient way to encode and decode custom structs.

    struct Sentence : Codable {
        let sentence : String
        let lang : String
    }
    
    let sentences = [Sentence(sentence: "Hello world", lang: "en"), 
                     Sentence(sentence: "Hallo Welt", lang: "de")]
    
    do {
        let jsonData = try JSONEncoder().encode(sentences)
        let jsonString = String(data: jsonData, encoding: .utf8)!
        print(jsonString) // [{"sentence":"Hello world","lang":"en"},{"sentence":"Hallo Welt","lang":"de"}]
    
        // and decode it back
        let decodedSentences = try JSONDecoder().decode([Sentence].self, from: jsonData)
        print(decodedSentences)
    } catch { print(error) }
    
    0 讨论(0)
  • 2020-12-03 17:37

    Swift 4 supports the Encodable protocol e.g.

    struct Sentence: Encodable {
        var sentence: String?
        var lang: String?
    }
    
    let sentence = Sentence(sentence: "Hello world", lang: "en")
    

    Now you can automatically convert your Struct into JSON using a JSONEncoder:

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

    Print it out:

    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

    0 讨论(0)
  • 2020-12-03 17:43

    Use the NSJSONSerialization class.

    Using this for reference, you may need to create a function which returns the JSON serialized string. In this function you could take the required properties and create a NSDictionary from them and use the class mentioned above.

    Something like this:

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

    Because your struct only has two properties it might be easier to just build the JSON string yourself.

    0 讨论(0)
提交回复
热议问题