2016-12-14 13 views
-6

新しいAPIから返されたJSON文字列を解析しようとしています。返されるJSON文字列は次のようになります。Swift 3.0を使用してこのJSONオブジェクトを解析する方法

QuerySearchResult":{ 
"StartAt":"1", 
"Count":"40", 
"TotalAvailable":"500", 
"Items":[ 
    {"TITLE":"OST420 Generation", 
    "PATH":"http:\\Test.pdf", 
    "WRITE":"2016-12-12T15:47:42", 
    "RANK":"32286574", 
    "SIZE":"145091", 
    "ISDOCUMENT":"true", 
    "ID":"18548", 
    "WPTASK":"Onsite Generation", 
    "WPDOCTYPE":"Local Operating Procedure", 
    "WPDOCREFID":"304580", 
    "WPCONTENTTYPE":"Document"}, 
    {"TITLE":"OST420 Measurement", 
    "PATH":"http:\Test33.pdf", 
    . 
    . 

私は以下のコードを使用してJSON変数を受け入れますが、アイテムをロードしようとすると失敗します。私はArrayDictionaryのまわりで使ってみましたが、それでも失敗します。アイテムで何を宣言する必要がありますか?

if let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as? Dictionary<String, AnyObject> { 
    for item in json { 
     if let dict = item as? Dictionary<String, AnyObject> { 
     if let items = json["Items"] as? Array<Dictionary<String, AnyObject>> { 
      for rec in items { 
       if let title = rec["TITLE"] as? String { 
        let xx = title 
       } 
      } 
     } 
    } 
} 
+1

あなたはJSONがどのように動作するか理解していない場合、あなたはjsonObjectプリントアウトすることから始めることができます - あなたは「JSON」という名前と、それが保存されている方法を自分の目で確かめてください、そこから、各データへのアクセス方法が明確になります。 –

+1

ログなどはありませんか?どの部分が失敗したのか、どのように分かっていますか? –

答えて

3

あなたは正しくDictionaryを反復処理する代わりに、単一の値にアクセスするためDictionaryをループされていないすべての最初には、直接subscriptingからアクセスし、スウィフト3でDictionaryの適切なJSON表記が[String : Any]あることで試してみてください。

if let json = try? JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any], 
    let queryDic = json["QuerySearchResult"] as? [String : Any], 
    let items = queryDic["Items"] as? [[String : Any]] { 

    for item in items { 
     if let title = item["TITLE"] as? String { 
       print(title) 
     } 
    } 
} 
+1

'for'ループの' if let'文の 'rec'の代わりに' item'を変更します。 –

+0

@ Karthick私の誤植を訂正してくれてありがとう:) –

+0

ありがとう、コメントは – user616076

0

SwiftyJSONを使用してください:あなたのコードよりもJSONを簡単かつ簡単に解析できます。

これを使用してどのように解析しますか?我々はJSONという解析方法

まずここでは、データとしてあなたの応答()

let jsonData = JSON(data: results!) 

を取得します。

import Foundation 
import SwiftyJSON 

enum JSONParseError : ErrorType { 
    case UnknownField 
    case EmptyJSON 
} 

extension JSONParseError : CustomStringConvertible { 
    var description: String { 
     switch self { 
     case .UnknownField: 
      return "Error when parsing json because there is no field" 
     case .EmptyJSON: 
      return "Error when parsing empty json" 
     } 
    } 
} 

guard let querySearchResult : [String : JSON] = jsonData["QuerySearchResult"].dictionary else{ 
    throw JSONParseError.UnknownField 
} 
guard let startAt : String = querySearchResult["StartAt"].string else{ 
    throw JSONParseError.UnknownField 
} 
guard let count : String = querySearchResult["Count"].string else{ 
    throw JSONParseError.UnknownField 
} 
guard let totalAvailable : String = querySearchResult["TotalAvailable"].string else{ 
    throw JSONParseError.UnknownField 
} 
guard let items : [JSON] = querySearchResult["Items"].array else{ 
    throw JSONParseError.UnknownField 
} 
if items.count > 0 { 
    for i in 0 ..< items.count{ 
      guard let title = items[i]["TITLE"].string else{ 
       throw JSONParseError.UnknownField 
      }.... //So On 
    } 
}else{ 
    throw JSONParseError.EmptyJSON   
} 
0

Jsonはデータを辞書と配列形式に戻すため、jsonデータをそのように扱うため、わかりやすくなります。

中括弧{{'と}}のデータは辞書です。

および中括弧 '['または ']'のデータは配列です。

辞書とそれが正確に動作する配列プロパティでjsonデータの解析を開始します。または、確認のためにjsonデータを印刷してください。

3

スウィフト3.1で: -

func parseJson(anyObj:AnyObject) { 

      if let anyObj = anyObj as? Array<Dictionary<String,AnyObject>> { 
       self.yourArrayName = anyObj.flatMap({yourModelName(json:$0) }) 
      } 
     } 
関連する問題