【问题标题】:Invalid type in JSON write (_SwiftValue) when trying to put method with Alamofire [duplicate]尝试使用 Alamofire 放置方法时,JSON 写入 (_SwiftValue) 中的类型无效 [重复]
【发布时间】:2019-06-13 12:35:31
【问题描述】:

我尝试使用 JSON 类型向服务器发出 put 请求,但它给了我错误。 这是错误详情。

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'JSON 写入中的类型无效 (_SwiftValue)'

这是一个代码。

var attdList : JSON = [:]
...
var clientsAry = attdList["clients"]
...
let params = ["clients" : clientsAry, "submitted" : 1]
...
Alamofire.request(url + req_task, method: .put, parameters: params, encoding: JSONEncoding(options: []), headers:headers).responseJSON { response in
...

我打印了 params 变量,它显示如下。 有人可以帮忙吗?

▿ 1 element
  ▿ 0 : 2 elements
    - key : "clients"
    ▿ value : [
  {
    "id" : null,
    "hours" : "0",
    "client" : {
      "id" : 2,
      "name" : "Anders Andersson"
    }
  },
  {
    "id" : null,
    "hours" : "1",
    "client" : {
      "id" : 4,
      "name" : "Gun Gunsson"
    }
  },
  {
    "id" : null,
    "hours" : "2",
    "client" : {
      "id" : 3,
      "name" : "Johan Johansson"
    }
  },
  {
    "id" : null,
    "hours" : "3",
    "client" : {
      "id" : 1,
      "name" : "Maria Martinsson"
    }
  }
]
      ▿ rawArray : 4 elements
        ▿ 0 : 3 elements
          ▿ 0 : 2 elements
            - key : "id"
            - value : <null>
          ▿ 1 : 2 elements
            - key : "hours"
            - value : "0"
          ▿ 2 : 2 elements
            - key : "client"
            ▿ value : 2 elements
              ▿ 0 : 2 elements
                - key : "id"
                - value : 2
              ▿ 1 : 2 elements
                - key : "name"
                - value : Anders Andersson
        ▿ 1 : 3 elements
          ▿ 0 : 2 elements
            - key : "id"
            - value : <null>
          ▿ 1 : 2 elements
            - key : "hours"
            - value : "1"
          ▿ 2 : 2 elements
            - key : "client"
            ▿ value : 2 elements
              ▿ 0 : 2 elements
                - key : "id"
                - value : 4
              ▿ 1 : 2 elements
                - key : "name"
                - value : Gun Gunsson
        ▿ 2 : 3 elements
          ▿ 0 : 2 elements
            - key : "id"
            - value : <null>
          ▿ 1 : 2 elements
            - key : "hours"
            - value : "2"
          ▿ 2 : 2 elements
            - key : "client"
            ▿ value : 2 elements
              ▿ 0 : 2 elements
                - key : "id"
                - value : 3
              ▿ 1 : 2 elements
                - key : "name"
                - value : Johan Johansson
        ▿ 3 : 3 elements
          ▿ 0 : 2 elements
            - key : "id"
            - value : <null>
          ▿ 1 : 2 elements
            - key : "hours"
            - value : "3"
          ▿ 2 : 2 elements
            - key : "client"
            ▿ value : 2 elements
              ▿ 0 : 2 elements
                - key : "id"
                - value : 1
              ▿ 1 : 2 elements
                - key : "name"
                - value : Maria Martinsson
      - rawDictionary : 0 elements
      - rawString : ""
      - rawNumber : 0
      - rawNull : <null>
      - rawBool : false
      - type : SwiftyJSON.Type.array
      - error : nil

【问题讨论】:

  • 你在用swiftyJSON吗?clientsAry 是什么类型的?
  • 是的,我使用的是 SwiftyJSON,clientAry 是 JSON 类型,我认为如上结果所示。
  • 对不起,我已经查过了,还没有找到答案
  • 你应该把clientsAry的JSON类型转换成Array&lt;Dictionary[String:String]&gt;

标签: ios json swift swifty-json


【解决方案1】:

错误信息表示使用了非法类型(Parameters),JSON仅支持stringnumber&lt;null&gt;array/dictionary

您应该将您的 JSON 数据转换为字符串:

let jsonData =  try JSONSerialization.dataWithJSONObject(attdList, options: .prettyPrinted) // first of all convert json to the data
    let convertedString = String(data: jsonData, encoding: .utf8) // the data will be converted to the string

然后将您的数据发送到服务器:

let params = ["clients" : convertedString, "submitted" : 1]
...
Alamofire.request(url + req_task, method: .put, parameters: params, encoding: JSONEncoding(options: []), headers:headers).responseJSON { response in
...

【讨论】:

  • 请建议像 JSONSerialization 这样的原生 Swift 类型,而不是 NSJSONSerialization。你也可以建议他可以开始使用Codable而不是SwiftyJSON,然后他可以使用JSONEncoder轻松编码数据
猜你喜欢
  • 2017-01-27
  • 2020-04-03
  • 2017-03-12
  • 2017-01-24
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多