【问题标题】:JSON handling error: Output not fetched correctlyJSON 处理错误:未正确获取输出
【发布时间】:2016-05-16 07:18:50
【问题描述】:

我有以下 JSON 响应。目前,我的 POST 请求将在我的控制台输出中给我“用户名”。但是,当我运行应用程序时,我的 alertView(在 handlingAuthentication 中找到,提供的链接)返回 nil。

{
  "username" : [
  "The username field is required."
  ],
  "password" : [
  "The password field is required."
  ]
}

我该怎么做:

  • 获取字符串“用户名字段为必填项”
  • 在方法 handlingAuthentication 中将字符串传递给我的警报视图
  • 从 JSON 响应中获取多个字符串(例如,在 AlertView 中打印:“密码字段是必需的。下一行用户名字段是必需的。”)

这是我的 POST 请求

import Foundation
import Alamofire
import SwiftyJSON
import RealmSwift

class Login {

init(userName: String, passWord: String) {
    Data.sharedInstance.userName = userName
    Data.sharedInstance.passWord = passWord
}

// call this method to login
func getRequest() {

    Alamofire.request(.POST, Data.todoEndpoint, parameters: ["username": Data.sharedInstance.userName!, "password": Data.sharedInstance.passWord!])
        .responseJSON { response in

            var errorFound = Bool()
            var errorMessage = String()

            if let result = response.result.value
            {
                let value = JSON(result)
                var outcome = String()

                //No username
                if value["password"] == nil && value["message"] == nil && value["name"] == nil
                {
                    errorFound = true
                    for output in value {
                        errorMessage = output.0
                        print(errorMessage)
                    }

                }

            }
            else
            {
                print("JSON data is nil.")
            }

            let errorDict = ["error": errorFound, "message": errorMessage]
        NSNotificationCenter.defaultCenter().postNotificationName("errorPresent", object:errorDict)


    }

}


}

我显示警报消息的代码在这里https://codeshare.io/VilQl

【问题讨论】:

    标签: ios json foreach alamofire swifty-json


    【解决方案1】:

    你可以这样做,

       var dict: [NSObject : AnyObject] = [NSObject : AnyObject]() // your response here which you have print in question
        var arr: [AnyObject] = (dict["username"] as! [AnyObject])
        let str: String = arr[0] as! String
    

    然后将这个字符串传递给 alertview 的消息。

    希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      首先确定

      if(errorFound as! NSObject == 1) 
      

      应该给你一个警告,因为if let errorFound = dict["error"]{ 已经解开errorFound 所以使用as!是多余的:)

      你可以简单地说

      if(errorFound as NSObject == 1)
      

      第二个let errorMessage = dict["message"]?.stringValue这个可以换成

      let errorMessage : String! = dict["message"]! as! String
      

      如果你想检查字典是否对关键信息有任何价值

      if let errorMessage = dict["message"] as? String{
           print("\(errorMessage)")
      }
      

      现在您的警报应该正确显示了:)

      编辑

      根据您的评论:)

      if value["message"] == nil && value["name"] == nil
      {
          errorFound = true
          errorMessage = value["username"][0]
          errorMessage += "\n"
          errorMessage += value["password"][0]
      }
      

      这应该将数据传递给下一个方法:)

      【讨论】:

      • 对于我的 POST 请求,如何获得“用户名字段是必需的”?我试过 output["username"] 但我会被抛出一个“类型元素没有下标成员”错误。
      • 我已经尝试过这样做,但我会被抛出一个“无法使用 'String' 类型的索引来下标 'JSON' 类型的值”错误
      • @noobdev : 我的错你能试试我更新的答案吗:)
      猜你喜欢
      • 2012-05-15
      • 2016-02-05
      • 2013-03-12
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多