Недопустимый тип верхнего уровня в JSON write 'в swift с использованием Alamofire - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть строка, напечатанная следующим образом:

    ["answers": <__NSArrayI 0x7fb0bce08550>(
{
    qid = 884;
    value =     (
        fSociety
    );
}
)
, "uniqid": t-26963212]

Я преобразую NSObject в Json, используя кодировщик, подобный этому

let realm = try! Realm()
        let savedExamResponse = realm.object(ofType: SavedExamResponse.self, forPrimaryKey: id)
        answersToSubmit.uniqid = savedExamResponse?.uniqueId

        var answerListToSubmit =  [QuestionAnswersToSubmit]()

        for item in (savedExamResponse?.questionAnswerList)! {
            var answerToSubmit = QuestionAnswersToSubmit()
            answerToSubmit.qid =  item.questionId
            answerToSubmit.value.append(item.selectedOption) 
            answerListToSubmit.append(answerToSubmit)

        }
        let answersToSubmit = SubmitAnswerModel(answers:answerListToSubmit,uniqid:savedExamResponse?.uniqueId)

        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted

        let data = try? encoder.encode(answersToSubmit)
        do {
            if let jsonObj = try JSONSerialization.jsonObject(with: data!, options : .allowFragments) as? [String:AnyObject]
            {
                print(jsonObj) // use the json here
            } else {
                print("bad json")
            }
        } catch let error as NSError {
            print(error)
        }

Мне нужно отправлять параметр BODY в моем API, поэтому всякий раз, когда япопытаться отправить это значение я получаю Invalid top-level type in JSON write'.Я использую Alamofire, как это

let urlString = UrlCollection.submitAnswerUrl + "uniqid=" + answersToSubmit.uniqid! + "&token=" + token

        var objectDictionaries = [NSDictionary]()

        let allObjects = answersToSubmit

        var request = URLRequest(url: URL(string: urlString)!)
        request.httpMethod = "POST"

        request.setValue("application/json", forHTTPHeaderField: "Content-Type")


        request.httpBody = try? JSONSerialization.data(withJSONObject: data, options: JSONSerialization.WritingOptions.prettyPrinted)

        Alamofire.request(request)
            .responseJSON { response in
               switch response.result {
                case .failure(let error):
                    print(error)

                    if let data = response.data, let responseString = String(data: data, encoding: .utf8) {
                        print(responseString)
                    }
                case .success(let responseObject):
                    print(responseObject)
                }
        }

Я не могу понять, что именно ошибка.Это из-за неправильного формата JSON, если тогда, как я должен сделать это правильно.Любая помощь будет высоко ценится.Спасибо

1 Ответ

0 голосов
/ 19 апреля 2019

Я нашел проблему в своем коде

  request.httpBody = try? JSONSerialization.data(withJSONObject: data, options: JSONSerialization.WritingOptions.prettyPrinted)

вместо сериализации уже закодированного значения я передал это значение в request.httpBody следующим образом: request.httpBody = data

...