10

私は Alamofire と SwiftyJSOn を使用して JSON 出力を解析しています。非常にうまく機能しますが、一部のサイトでは json をエスケープ出力で提供しています。以下のようにAlamofireを使用します

    Alamofire.request(.POST, url, parameters: param, encoding: .JSON)
        .responseJSON { (req, res, json, error) in
         var json = JSON(json!)

サイトは、エスケープされた文字列を含む JSON 結果を提供するため、SwiftyJSON はそれをデコードできません。以下に変換するにはどうすればよいですか

{
    "d": "{\"UniqeView\":{\"ArrivalDate\":null,\"ArrivalUnitId\":null,\"DeliveryCityName\":null,\"DeliveryTownName\":null},\"ErrorMessage\":null,\"Message\":null,\"IsFound\":false,\"IsSuccess\":true}"
}

のようなものに

{
       "d": {
          "UniqeView": {
             "ArrivalDate": null,
             "ArrivalUnitId": null,
             "DeliveryCityName": null,
             "DeliveryTownName": null
          },
          "ErrorMessage": null,
          "Message": null,
          "IsFound": false,
          "IsSuccess": true
       }
    }
4

6 に答える 6

6
// This Dropbox url is a link to your JSON
// I'm using NSData because testing in Playground
if let data = NSData(contentsOfURL: NSURL(string: "https://www.dropbox.com/s/9ycsy0pq2iwgy0e/test.json?dl=1")!) {

    var error: NSError?
    var response: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error)
    if let dict = response as? NSDictionary {
        if let key = dict["d"] as? String {

            let strData = key.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
            var error: NSError?
            var response: AnyObject? = NSJSONSerialization.JSONObjectWithData(strData!, options: NSJSONReadingOptions.allZeros, error: &error)

            if let decoded = response as? NSDictionary {
                println(decoded["IsSuccess"]!)   // => 1
            }

        }
    }
}

ラッピング オブジェクトとそのコンテンツの 2 回デコードする必要があると思います。

于 2015-03-23T16:42:36.893 に答える
5

@ericd のコメントは、問題の解決に役立ちました。私はこの質問に対する彼の答えを受け入れました。非同期操作に Alamofire と SwiftyJSON を使用しているため、彼のコードを使用できませんでした。Alamofire と SwiftyJSON を使用したコードを次に示します。

Alamofire.request(.POST, url, parameters: param, encoding: .JSON)
   .responseJSON { (req, res, json, error) in
    if(error != nil) {
        NSLog("Error: \(error)")
        failure(res, json, error)
    }
    else {

        var jsond = JSON(json!)
        var data = jsond["d"].stringValue.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
        jsond = JSON(data: data!)
于 2015-03-24T10:19:18.857 に答える
2

多くの人が、取得したものとシステムが出力したものを区別するのに問題を抱えています。したがって、最初のステップは、正確に何を受け取っているか、およびこれらのエスケープ文字が印刷のアーティファクトであるかどうかを確認する必要があることです。

これが実際に受信したものである場合、サーバーは単一のキー「d」と文字列を含む辞書を送信しており、文字列にはシリアル化されたデータが含まれています。その場合、文字列を NSData に変換し、それを NSJSONSerialization に押し込みます。これにより、必要な辞書に変換されます。これは、JSON データを送信するためのややばかげた方法ですが、起こります。

于 2015-03-23T16:31:47.637 に答える