2017-05-02 9 views
0

私はASP.Net上に構築された古いタイプのWebサービスを持っています。次の関数を使用すると、私はASMX Webサービスからのデータのいくつかのタイプを取得することができました:Webサービスから返されたjsonオブジェクトの型を判別できません

func getJsonData(sql: String, spparamnames: String, spParamValues: String, completeonClosure: @escaping (AnyObject?) ->()) { 

    let url = URL(string:"http://www.example.com/MyWebService.asmx/GetDataTableAsJson") 
    var request = URLRequest(url: url!) 
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") // the request is JSON 
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")  // the expected response is also JSON 
    request.httpMethod = "POST" 

    let dictionary = ["sql" : sql, "spparamnames" : spparamnames, "spparamvalues" : spParamValues] //Parameters are here seperated with comma 
    request.httpBody = try! JSONSerialization.data(withJSONObject: dictionary) 

    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     guard let data = data, error == nil else { 
      print(error.debugDescription)         // some fundamental network error 
      return 
     } 

     do { 

      if response != nil { 

       let myJson = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String:AnyObject] 
       let isCorectJson = JSONSerialization.isValidJSONObject(myJson) 
       let charcount = (myJson["d"] as? String)?.characters.count 
       let cc = charcount ?? 0 
       if isCorectJson == true && cc > 0 { 

        completeonClosure(myJson as AnyObject?) 
        ) 
       } else { 
        let str2 = "Connection Error" 
        completeonClosure(str2 as AnyObject?) 
       } 

      } 

     } catch let JsonError { 
      print(JsonError) 
     } 
    } 
    task.resume() 
} 

私はスウィフトとのクエリを実行し、NSDictionaryとしてオブジェクト型をキャストし、私の出力結果は次のようになります。

getJsonData(sql: "SELECT TOP 3 User_id, LoweredUserName FROM Users", spparamnames: "", spParamValues: "") { 
    returnJSON in 
    OperationQueue.main.addOperation { 
     let mystr = returnJSON as? NSDictionary 
     print(mystr!)   
    } 
} 

結果:

{ 
    d = "[{\"User_id\":102,\"LoweredUserName\":\"abu alay\"},{\"User_id\":90,\"LoweredUserName\":\"ali es\"},{\"User_id\":95,\"LoweredUserName\":\"alper ay\"}]"; 
} 

私は結果が辞書のいくつかの種類だと思い、私はので、私が信奉することはできません、配列に結果を変換することができませんでした結果を効率的に使用することができます。 print(returnJSON [0] ["LoweredUserName"])のような結果を読み取るためにはどうすればよいですか?結果の先頭にある文字 "d"の意味は何ですか?事前に多くの感謝。

+0

この辞書の "d"キーの値は、別のJSONオブジェクト(辞書の配列)の文字列表現です。可能な複製のhttp://stackoverflow.com/q/37423950/2227743 – Moritz

+0

ありがとうエリック。とった。文字 "d"は実際には辞書の配列です。したがって、私は意味のある結果を返すために、以下をWebサービス関数に追加しなければなりませんでした:let str = myJson ["d"]?文字列 completeonClosure(AnyObjectとしての文字列) – user1960968

答えて

0

あなたのレスポンスがArrayであるようですが、辞書オブジェクトの配列にキャストしようとします。

if let myJson = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [[String:AnyObject]] { 
    // parse each object here 
} 

私は運動場で走ったこのコード例では、正常に動作するようです:

let jsonString = "[{\"User_id\":102,\"LoweredUserName\":\"abu alay\"},{\"User_id\":90,\"LoweredUserName\":\"ali es\"},{\"User_id\":95,\"LoweredUserName\":\"alper ay\"}]" 
let jsonData = jsonString.data(using: String.Encoding.utf8) 
if let json = try? JSONSerialization.jsonObject(with: jsonData!, options: .mutableContainers) as? [[String:AnyObject]] { 
    print(json) 
} 

出力:

Optional([["User_id": 102, "LoweredUserName": abu alay], ["User_id": 90, "LoweredUserName": ali es], ["User_id": 95, "LoweredUserName": alper ay]]) 
+0

あなたは命の恩人です!ありがとう! – user1960968

+0

あなたの歓迎ですが、あなたのために解決したら答えを受け入れてください。プロジェクトで幸運 – Scriptable

+0

完了!もう一度ありがとう、それは私の多くを助けた。私は再び私の道にいる... – user1960968

0

あなたが示されているテキストは、その結果、あなたの全体の体がある場合得られた:

{ 
    d = "[{\"User_id\":102,\"LoweredUserName\":\"abu alay\"},{\"User_id\":90,\"LoweredUserName\":\"ali es\"},{\"User_id\":95,\"LoweredUserName\":\"alper ay\"}]"; 
} 

正しくフォーマットされたJSONではありません。それを正しくフォーマットするためには、 "d"を二重引用符で囲む必要があります。

「d」領域に含まれるJSONを取得するために、結果に対してカスタム解析を行う必要があるようです。

関連する問題