Json 解析 Swift 3 Alamofire

Posted

技术标签:

【中文标题】Json 解析 Swift 3 Alamofire【英文标题】:Json Parsing Swift 3 Alamofire 【发布时间】:2017-01-10 18:52:00 【问题描述】:

我是 Swift 3 的新手,我遇到了让 Json 返回然后发送请求的问题。我正在尝试使用参数用户名和密码向服务器发送一个发布请求,并通过 Json 获得带有信息的响应,但我无法让数据返回。

输出:

错误:NSURLErrorDomain:-1003 状态码:200,标题 连接=关闭; “内容类型”=“应用程序/json”; “传输编码” = 身份

android 上的请求如下所示:

            "\n" +
            "    \"jsonrpc\": \"2.0\",\n" +
            "    \"id\": \"1\",\n" +
            "    \"method\": \"call\",\n" +
            "    \"params\": [\n" +
            "        \"" + LOGIN_TOKEN + "\",\n" +
            "        \"session\",\n" +
            "        \"login\",\n" +
            "        \n" +
            "            \"username\": \"" + userName + "\",\n" +
            "            \"password\": \"" + password + "\"\n" +
            "        \n" +
            "    ]\n" +
            "";

这是我应该发送的请求:

" \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"call\", \"params\": [ \"00000000000000000000000000000000\", \"session\", \"login\",  \"username\": \"root\", \"password\": \"admin01\"   ] " 

这是我的代码:

   override func viewDidLoad() 
   var userName = "root"
   var password = "admin01"
   //var LOGIN_TOKEN = 0000000000000000

    let jsonObject: [String: Any] =
        ["jsonrpc" : 2.0,
         "id": 1,
         "method": "call",
         "params": [ "00000000000000",
                     "session",
                     "login",
                     [ "username": userName,
                       "password": password]],
         ]

    do 
        let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted)
        // here "jsonData" is the dictionary encoded in JSON data

        let decoded = try JSONSerialization.jsonObject(with: jsonData, options: [])
        // here "decoded" is of type `Any`, decoded from JSON data

        // you can now cast it with the right type
        if let dictFromJSON = decoded as? [String:String] 
            // use dictFromJSON
        
     catch 
        print(error.localizedDescription)
    

    Alamofire.request("http://192.168.1.1/ubus", method: .post, parameters: jsonObject, encoding: JSONEncoding.default)
        .responseJSON  response in
            print(response)
            //to get status code
            if let status = response.response?.statusCode 
                switch(status)
                case 201:
                    print("example success")
                default:
                    print("error with response status: \(status)")
                
            
            //to get JSON return value
            if let result = response.result.value 
                let JSON = result as! NSDictionary
                print(JSON)
            

    

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

【问题讨论】:

尝试使用 SwiftyJSON github.com/SwiftyJSON/SwiftyJSON 【参考方案1】:

您的 JSON 对象似乎无效

有一些非常有用的免费 JSON 验证器。想到的一个是http://jsonlint.com

我认为,从您发布的代码可以解释的情况来看,您希望您的 jsonObject 看起来像这样,这是一个有效的 JSON:

[
    
    "jsonrpc": 2.0,
    "id": 1,
    "method": "call",
    "params": ["00000000000000", "session", "login"],
    "username": username,
    "password": password
    
]

我假设 usernamepassword 变量是您已经分配的字符串?

【讨论】:

我遇到了一些错误。在“jsonrpc”之后需要;并且任何类型都不能与数组一起使用,我收到了关于 Android Studio 的请求,并且它工作得很好。 @GediminasUrbonas - 这是因为它是 JSON 代码,而您正试图将其设为 Swift 对象。您应该考虑使用上述代码创建一个JSON 文件,然后学习如何将JSON 转换为Data。您不能只将JSON 代码转换为Swift Data,它必须以某种方式进行转换。

以上是关于Json 解析 Swift 3 Alamofire的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire 在 swift 3 中解析 Json

如何使用 Alamofire 在 Swift 3 中解析 JSON?

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?

Swift 3 Alamofire Swifty json 解析问题

如何使用新的 Swift 3 和 Alamofire 解析 JSON(字典和数组)

使用 Alamofire Swift 3 和 Xcode 8 beta 解析 JSON 没有数据