【问题标题】:"Incorrect JSON format"“不正确的 JSON 格式”
【发布时间】:2019-05-08 07:27:49
【问题描述】:

我正在使用所需的 body 参数发出POST 请求,在POSTMAN 中测试这个POST 请求会给我正确的响应,但是当我从我的代码中传递相同的body 参数时,我出现以下错误-:

Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.

代码-:

     func submitStudentAttendance(url:String,id:String,SessionID: Int,SchoolID:Int,BatchID:Int,ClassID:Int,SectionID:Int,Medium:Int,Date:String,accessToken:String) {
            let params : [String:Any] = [
                "$id":"1",
                "SchoolID":1,
                "SessionID":42,
                "BatchID":106,
                "ClassID":634,
                "SectionID":1246,
                "Medium":"English",
                "Date":"0001-01-01T00:00:00",
                "CreatedBy":118,
                "CreatedOn":"2019-04-14T17:02:34",
                "studentList":"",
                "AttendenceData":"[{\"ID\":0,\"SchoolID\":null,\"SessionID\":null,\"ClassID\":634,\"SectionID\":1246,\"StudID\":\"DSM00399\",\"SubjectID\":null,\"Date\":\"0001-01-01T00:00:00\",\"Attendence\":\"P\",\"CreatedOn\":null,\"CreatedBy\":0,\"IsActive\":null,\"Remarks\":\"rem16\",\"timeID\":null,\"AtndType\":null,\"BatchID\":null,\"Medium\":null}]"
]

            let urlRequest = NSURL(string: url)
            var request = URLRequest(url: urlRequest! as URL)
            let tokenString = "Bearer " + accessToken
            request.httpMethod = "POST"
            request.setValue(tokenString, forHTTPHeaderField: "Authorization")

            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            let data = try! JSONSerialization.data(withJSONObject: params, options: [])

            let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
            if let json = json {
                print(json)
            }
            request.httpBody = json!.data(using: String.Encoding.utf8.rawValue);

            let alamoRequest = Alamofire.request(request as URLRequestConvertible)
            alamoRequest.responseString {

                response in
                switch response.result {
                case .success:
                    if response.data != nil {
                        do{
                            let json =  try JSON(data: response.data!)
                            print(json)
                        }catch{
                            print(error)
                        }
                    }
                    break
                case .failure(let error):
                    print(error)
                }
            }
        }

正文部分与POSTMAN 中的完全相同,但仍然无法正常工作。谁能让我知道这里出了什么问题?这是服务器端问题还是我以错误的格式发送正文请求?

邮递员回应 -:

【问题讨论】:

  • 这是服务器端问题,它清楚地表明您获得的值不是正确的 json 格式。没有投反对票
  • 当您将Data 提供为request.httpBody 时,您无需将其转换为NSString 并最终转换为Data。并使用Dictionary 类型而不是String 作为"AttendenceData" 键的值。

标签: json swift alamofire


【解决方案1】:

当您的问题中声明的参数转换为 JSON 时,它看起来像这样。在这里,AttendanceData 值未转换为正确的 JSON 结构。它看起来像一个字符串。

来自参数的 JSON:

{
  "Date": "0001-01-01T00:00:00",
  "CreatedBy": 118,
  "$id": "1",
  "BatchID": 106,
  "ClassID": 634,
  "Medium": "English",
  "studentList": "",
  "SchoolID": 1,
  "SectionID": 1246,
  "AttendenceData": "[{\"ID\":0,\"SchoolID\":null,\"SessionID\":null,\"ClassID\":634,\"SectionID\":1246,\"StudID\":\"DSM00399\",\"SubjectID\":null,\"Date\":\"0001-01-01T00:00:00\",\"Attendence\":\"P\",\"CreatedOn\":null,\"CreatedBy\":0,\"IsActive\":null,\"Remarks\":\"rem16\",\"timeID\":null,\"AtndType\":null,\"BatchID\":null,\"Medium\":null}]",
  "CreatedOn": "2019-04-14T17:02:34",
  "SessionID": 42
}

但是,如果您声明 param 如下所示,并转换为 JSON,则 AttendanceData 值正确转换为 JSON。

let params : [String:Any] = [
    "$id":"1",
    "SchoolID":1,
    "SessionID":42,
    "BatchID":106,
    "ClassID":634,
    "SectionID":1246,
    "Medium":"English",
    "Date":"0001-01-01T00:00:00",
    "CreatedBy":118,
    "CreatedOn":"2019-04-14T17:02:34",
    "studentList":"",
    "AttendenceData":[
        "ID":0,"SchoolID":"null","SessionID":"null","ClassID":634,"SectionID":1246,"StudID":"DSM00399","SubjectID":"null","Date":"0001-01-01T00:00:00","Attendence":"P","CreatedOn":"null","CreatedBy":0,"IsActive":"null","Remarks":"rem16","timeID":"null","AtndType":"null","BatchID":"null","Medium":"null"
    ]
]

JSON

{
  "$id": "1",
  "BatchID": 106,
  "CreatedBy": 118,
  "ClassID": 634,
  "studentList": "",
  "SectionID": 1246,
  "SessionID": 42,
  "AttendenceData": {
    "IsActive": "null",
    "AtndType": "null",
    "SectionID": 1246,
    "timeID": "null",
    "SessionID": "null",
    "Attendence": "P",
    "Date": "0001-01-01T00:00:00",
    "Remarks": "rem16",
    "Medium": "null",
    "SchoolID": "null",
    "BatchID": "null",
    "ClassID": 634,
    "StudID": "DSM00399",
    "SubjectID": "null",
    "CreatedBy": 0,
    "ID": 0,
    "CreatedOn": "null"
  },
  "Date": "0001-01-01T00:00:00",
  "CreatedOn": "2019-04-14T17:02:34",
  "Medium": "English",
  "SchoolID": 1
}

希望它也能解决您的问题。

【讨论】:

  • 您能否将“let data = try!JSONSerialization.data(withJSONObject: params, options: [])”中的json数据直接分配给request.httpBody,而不是将其转换为字符串然后返回数据?
  • 你的意思是 request.httpbody = data ?
  • 是的。只是一个想法
  • “让 json = 尝试 JSON(数据:response.data!)”。你能分享这个代码吗?我不明白这实际上是如何将数据转换为 JSON 的。
  • 这是响应数据的问题,因为调用进入了.Success case,并且带有try的方法会抛出错误。
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多