簡體   English   中英

如何快速將json對象逐個寫入json對象

[英]how to write json objects one by one in to a json object in swift

我需要使用嵌套對象創建答案JSON

我嘗試使用mappable,但無法解決問題

我需要創建這種數組

{  
   "interactionId":"daade6b6adcd8b063a355e28bc1f1341",
   "futureSurveyAnswers":[  
      {  
         "type":"imagepicker",
         "qcode":"vxo20zeezo",
         "values":[  
            {  
               "value":"lion"
            }
         ]
      },
      {  
         "type":"radiogroup",
         "qcode":"s4ep4s0shf",
         "values":[  
            {  
               "value":"item1"
            }
         ]
      },
      {  
         "type":"checkbox",
         "qcode":"76k5cpnpki",
         "values":[  
            {  
               "value":"item1"
            },
            {  
               "value":"item2"
            }
         ]
      }
   ],
   "originalResultArray":"{\"question2\":\"item1\",\"question3\":[\"item1\",\"item2\"],\"question1\":\"lion\"}"
}

當前,最好使用的最佳解決方案是Codable協議。 在線上有很多示例和教程,因此請檢查一兩個,我相信您會發現它非常易於使用。

關鍵是您可以直接在JSON上編碼具體的類或結構。 因此,您的問題就不在JSON本身,而​​只是結構化您的類。 例如:

class Survey {

    class Answer {
        enum AnswerType: String {
            case imagepicker
        }
        class Value {
            var value: String?
        }

        var type: AnswerType = .imagepicker
        var qcode: String?
        var values: [Value] = [Value]()
    }

    let interactionId: String
    var futureSurveyAnswers: [Answer] = [Answer]()
    var originalResultArray: String?

    init(interactionId: String) { self.interactionId = interactionId }
}

這樣,您可以輕松地根據需要修改結構。 例如:

let survey = Survey(interactionId: "0")
survey.futureSurveyAnswers.append({
    let answer = Survey.Answer()
    answer.qcode = "test"
    return answer
}())

因此,要將其擴展到可編碼,您實際上需要將可Codable協議附加到您的類和任何嵌入式組件中:

class Survey: Codable {

    class Answer: Codable {
        enum AnswerType: String, Codable {
            case imagepicker
        }
        class Value: Codable {
            var value: String?
        }

        var type: AnswerType = .imagepicker
        var qcode: String?
        var values: [Value] = [Value]()
    }

    let interactionId: String
    var futureSurveyAnswers: [Answer] = [Answer]()
    var originalResultArray: String?

    init(interactionId: String) { self.interactionId = interactionId }
}

現在,您可以像以下這樣簡單地獲取JSON:

let survey = Survey(interactionId: "0")
survey.futureSurveyAnswers.append({
    let answer = Survey.Answer()
    answer.values.append({
        let value = Survey.Answer.Value()
        value.value = "some"
        return value
    }())
    answer.qcode = "test"
    return answer
}())

let encoder = JSONEncoder()
if let jsonData = try? encoder.encode(survey) {
    print("Generated data: \(jsonData)")
}

我希望這能為您指明正確的方向。

從注釋中可以看出,這是我用作JSON的測試示例:

class Survey: Codable {

    class Answer: Codable {
        enum AnswerType: String, Codable {
            case imagepicker
        }
        class Value: Codable {
            var value: String?
            init(value: String? = nil) { self.value = value }
        }

        var type: AnswerType = .imagepicker
        var qcode: String?
        var values: [Value] = [Value]()
    }

    let interactionId: String
    var futureSurveyAnswers: [Answer] = [Answer]()
    var originalResultArray: String?

    init(interactionId: String) { self.interactionId = interactionId }
}

func addTestAnswer(to survey: Survey) {
    let answer = Survey.Answer()
    answer.values.append(.init(value: "Random value \(Int.random(in: 1...100))"))
    answer.values.append(.init(value: "Random value \(Int.random(in: 1...100))"))
    answer.values.append(.init(value: "Random value \(Int.random(in: 1...100))"))
    answer.values.append(.init(value: "Random value \(Int.random(in: 1...100))"))
    survey.futureSurveyAnswers.append(answer)
}

func testRandomSurveyJSON() {
    let survey = Survey(interactionId: "randomSurvey")
    addTestAnswer(to: survey)
    addTestAnswer(to: survey)
    addTestAnswer(to: survey)
    addTestAnswer(to: survey)
    addTestAnswer(to: survey)

    print("Got JSON: \(String(data: try! JSONEncoder().encode(survey), encoding: .utf8)!)")
}

並得到以下結果:

Got JSON: {"interactionId":"randomSurvey","futureSurveyAnswers":[{"type":"imagepicker","values":[{"value":"Random value 74"},{"value":"Random value 4"},{"value":"Random value 26"},{"value":"Random value 93"}]},{"type":"imagepicker","values":[{"value":"Random value 43"},{"value":"Random value 65"},{"value":"Random value 38"},{"value":"Random value 88"}]},{"type":"imagepicker","values":[{"value":"Random value 56"},{"value":"Random value 88"},{"value":"Random value 57"},{"value":"Random value 94"}]},{"type":"imagepicker","values":[{"value":"Random value 66"},{"value":"Random value 52"},{"value":"Random value 89"},{"value":"Random value 27"}]},{"type":"imagepicker","values":[{"value":"Random value 53"},{"value":"Random value 93"},{"value":"Random value 30"},{"value":"Random value 55"}]}]}

這似乎是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM