как записать json-объекты один за другим в json-объект в swift - PullRequest
0 голосов
/ 09 июля 2019

Мне нужно создать ответ 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\"}"
}

1 Ответ

2 голосов
/ 09 июля 2019

В настоящее время, вероятно, лучшее решение для использования - протокол 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"}]}]}

что кажется правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...