使用 Alamofire 快速写入 JSON 中的***类型无效

Posted

技术标签:

【中文标题】使用 Alamofire 快速写入 JSON 中的***类型无效【英文标题】:Invalid top-level type in JSON write' in swift using Alamofire 【发布时间】:2019-04-18 11:37:27 【问题描述】:

我有一个这样打印的字符串

    ["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)
        

我需要在我的 API 中发送 BODY 参数,所以每当我尝试发送此值时,我都会得到 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 格式不正确,如果是这样,我应该如何使它正确。任何帮助将不胜感激。谢谢

【问题讨论】:

不相关但绝不会 prettyPrint JSON 如果只有 machines 会读取该字符串。他们真的不在乎。 这里的data 是什么:request.httpBody = try? JSONSerialization.data(withJSONObject: data @Larme 数据是要发送到 api 的编码值。 JSONSerialization 是一个错误,直接向request.httpBody 发送数据对我有用。 【参考方案1】:

我在我的代码中发现了问题

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

我没有序列化一个已经编码的值,而是将该值传递给request.httpBody,如下所示:request.httpBody = data

【讨论】:

以上是关于使用 Alamofire 快速写入 JSON 中的***类型无效的主要内容,如果未能解决你的问题,请参考以下文章

webservice的输出没有使用alamofire快速提供所需的json

使用 Alamofire 快速解析 JSON 时获取 nil 值

使用 alamofire 在 Swift 上解析 Json

Alamofire JSON 请求未从服务器中提取数据

使用 Alamofire 在 Swift 中发布嵌套 JSON

Alamofire中的responseJSON json解析