【问题标题】:Alamofire reponse invaid json in swift 5swift 5中的Alamofire响应无效的json
【发布时间】:2020-03-28 19:20:58
【问题描述】:

我正在使用 Swift 5 和 Alamofire 5,但响应是无效的 JSON。我已经打电话给 Postman,响应 JSON 是:

[ {
    "location_name": "Hamdard(waqf) Limited, Pantha Path, ধানমন্ডি আ/এ, লালমাটিয়া, ঢাকা, ঢাকা বিভাগ, বাংলাদেশ",
    "description": "D M-Th 16-0299",
    "engine": 1
{
  "location_name": "602/Chha, Red Crescent Shorak, Mogbazar, ঢাকা, ঢাকা বিভাগ, বাংলাদেশ",
    "description": "D M-Th 16-1953",
    "engine": 1   
}   ]

我这样称呼 Alamofire:

 let headers: HTTPHeaders = [
            "Content-Type": "application/json",
            "YumaSession": "my session_id"
        ]

    AF.request(url,method:.get,encoding: JSONEncoding.default, headers: headers).responseJSON  { response in

            switch response.result {
            case .success(let response):                 

                print("response--",response)

            case .failure(let error):

                print("error--->",error)
            }

但是 Alamofire 返回一个带有 Unicode 的 JSON 响应,如下所示:

 ({
    description = "D M-Th 16-0299";    
    "location_name" = "357 Modubag,Mogbazar, \U09a2\U09be\U0995\U09be, \U09a2\U09be\U0995\U09be \U09ac\U09bf\U09ad\U09be\U0997, \U09ac\U09be\U0982\U09b2\U09be\U09a6\U09c7\U09b6";
    lon = "90.41140444444444";
    online = 1;

},
    {
    description = "D M-Th 16-1953";       
    "location_name" = "53, Gulshan, \U0997\U09c1\U09b2\U09b6\U09be\U09a8 \U09e7, \U09a2\U09be\U0995\U09be, \U09a2\U09be\U0995\U09be \U09ac\U09bf\U09ad\U09be\U0997, 1212, \U09ac\U09be\U0982\U09b2\U09be\U09a6\U09c7\U09b6";
    lon = "90.40848888888888";
    online = 1;

}  )

请帮助我获得正确的 JSON 响应。

【问题讨论】:

  • 如果您已经使用过 alamofire,请尝试使用 swiftyJSON。然后你可以直接得到json响应。不需要 jsonencoder 。之后使用 let jsonData = json(response.result)
  • 这不是 JSON 响应,这是来自responseJSON 的解码 JSON 的打印描述。 unicode 只是其打印方式的产物。如果要查看原始正文字符串,请使用debugPrint(response)
  • 您必须更新您的问题。如果您找到可行的解决方案,请接受答案。按赞成票并打勾

标签: ios json swift alamofire swift5


【解决方案1】:

顺便说一句,这很简单。你必须关注Codableapproach。 这是我的答案。希望它会帮助你。我创建了本地 json 文件,您可以相应地传递 url。

您的 JSON:您缺少一个大括号和逗号。

[ {
    "location_name": "Hamdard(waqf) Limited, Pantha Path, ধানমন্ডি আ/এ, লালমাটিয়া, ঢাকা, ঢাকা বিভাগ, বাংলাদেশ",
    "description": "D M-Th 16-0299",
    "engine": 1

},
{
  "location_name": "602/Chha, Red Crescent Shorak, Mogbazar, ঢাকা, ঢাকা বিভাগ, বাংলাদেশ",
    "description": "D M-Th 16-1953",
    "engine": 1
}   ]

型号:

struct DataClass : Codable {

        let descriptionField : String?
        let engine : Int?
        let locationName : String?

        enum CodingKeys: String, CodingKey {
                case descriptionField = "description"
                case engine = "engine"
                case locationName = "location_name"
        }

        init(from decoder: Decoder) throws {
                let values = try decoder.container(keyedBy: CodingKeys.self)
                descriptionField = try values.decodeIfPresent(String.self, forKey: .descriptionField)
                engine = try values.decodeIfPresent(Int.self, forKey: .engine)
                locationName = try values.decodeIfPresent(String.self, forKey: .locationName)
        }

}

代码:

var AppData = [DataClass]()

    override func viewDidLoad() {
        super.viewDidLoad()


        if let url = Bundle.main.url(forResource: "file", withExtension: "json") {
            do {

                let data = try Data(contentsOf: url)
                 let decoder = JSONDecoder()
                let jsonData = try decoder.decode(Array<DataClass>.self, from: data)
                self.AppData = jsonData
                print (jsonData.first?.locationName ?? "")

            } catch {
                print("error:\(error)")
            }
        }
    }

打印:

Hamdard(waqf) Limited, Pantha Path, ধানমন্ডি আ/এ, লালমাটিয়া, ঢাকা, ঢাকা বিভাগ, বাংলাদেশ

【讨论】:

    【解决方案2】:

    包含库 SwiftyJSON ,使用下面这个简单的方法:

     AF.request(url,method:.get,encoding: JSONEncoding.default, headers: headers).responseJSON  { response in
    
                let value = response.result.value
                let json = JSON(value)
                print("response**:\(json)")
        }
    

    【讨论】:

    • 由于 Swift 4 SwiftyJSON 已经过时,取而代之的是 Codable
    • 是的,当然,先让他学这个,我希望他最终会学别人
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多