Как сопоставить этот неоднородный объект с моделью в Swift? - PullRequest
0 голосов
/ 14 октября 2019

Хорошо, поэтому я застрял в декодировании последнего элемента этого конкретного json этой моделью, "полезная нагрузка" всегда равна нулю, внутри этого "полезной нагрузки" объекта я могусоздать свою собственную структуру json, Я могу декодировать «текст», но когда дело доходит до последнего элемента, «полезной нагрузки» , , он не работает и всегда равен нулю.

Я не использую какие-либо сторонние библиотеки.

Класс моей модели.

struct DailougeFlowModel : Decodable {
//    private enum CodingKeys : String, CodingKey {
//        case responseId = "responseId"
//        case queryResult = "queryResult"
//    }
let responseId : String?
let queryResult : QueryResult?
}

 struct QueryResult: Decodable {
 //    private enum CodingKeys : String, CodingKey {
 //        case fulfillmentText = "fulfillmentText"
 //        case fulfillmentMessages = "fulfillmentMessages"
 //    }
let fulfillmentText : String?
let fulfillmentMessages : [FulfillmentMessages]?

}

struct FulfillmentMessages: Decodable {
let text : TextModel?
let payLoad : Questions?
}

struct TextModel: Decodable {
let text : [String]?
}

struct Questions : Decodable{
let questions : [String]?
 }

Этот json - то, что я получаю из dailogeflow (V2). Я интегрирую чатбот в приложение.

{
"responseId": "2b879f78-cc05-4735-a7e8-067fdb53a81d-f6406966",
"queryResult": {
"fulfillmentMessages": [
  {
    "text": {
      "text": [
        "Text Here"
      ]
    }
  },
  {
    "text": {
      "text": [
        "Another Reply For Hi"
      ]
    }
  },
  {
    "payload": {
      "questions": [
        "Question One",
        "Question Two",
        "Question Three",
        "Question Four"
      ]
    }
  }
]
}
}

1 Ответ

1 голос
/ 14 октября 2019

Укажите внутренние имена моделей в том виде, в каком они есть в ответе json. Если вы хотите указать собственное имя модели, вам нужно будет установить перечисление в каждой модели, как и в первой модели ResponseModel

// MARK: - ResponseModel
struct ResponseModel: Codable {
    let responseID: String
    let queryResult: QueryResult

    enum CodingKeys: String, CodingKey {
        case responseID = "responseId"
        case queryResult
    }
}

// MARK: - QueryResult
struct QueryResult: Codable {
    let fulfillmentMessages: [FulfillmentMessage]
}

// MARK: - FulfillmentMessage
struct FulfillmentMessage: Codable {
    let text: Text?
    let payload: Payload?
}

// MARK: - Payload
struct Payload: Codable {
    let questions: [String]
}

// MARK: - Text
struct Text: Codable {
    let text: [String]
}
...