2016-05-11 9 views
1

jsonのデータを3つの異なる配列に解析しようとしています。私は立ち往生しているようで、私のforループが決して入力されない理由を知らない。私はiOSを初めて使い、これを使って迅速に学びます。どんな助けもありがとう。印刷用iOSのplayground doメソッドでJsonの解析が解析されない

var myPicture = [String]() 
var myPath = [String]() 
var mylabel = [String]() 


let jsonString = "[{\"picture\" : \"Picture 1 \", \"path\": \"Path 1\" , \"label\" : \"Label 1\"}]" 
//Convert jsonString to NSData 
let myData = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 

do{ 

let promoJson = try NSJSONSerialization.JSONObjectWithData(myData, options:.AllowFragments) 

if let promtions = promoJson[""] as? [[String: AnyObject]] { 

    for promtions in promtions { 

     if let picture = promtions["picture"] as? String 
     { 
      myPicture.append(picture) 

      if let path = promtions["path"] as? String 
      { 
       myPath.append(path) 

       if let label = promtions["label"] as? String 
       { 
        mylabel.append(label) 

       } 

      } 
     } 
    } 

} 

}catch { 
print("Error with Json: \(error)") 
} 
print(myPicture.first) 
print(myPath.first) 
print(mylabel.first) 

結果がすべてゼロである: は、ここで私が使用していたコードです。したがって、配列に何も付加されていません。

+0

promtions = promoJson [""] ...行が何をしようとしているのか分かりません。たとえそれが成功したとしても、「昇進の約束のために」は挑戦的に間違っている。 – Gruntcakes

答えて

1

if let promtions = promoJson[""]部分はうまくいかず、とにかく役に立たないでしょう。これは辞書の配列にキャストする必要があるのはpromoJsonです。

あなたはそこまで溶液からいなかった、あなたのコードの私の作業バージョンを見て:

do { 
    let promoJson = try NSJSONSerialization.JSONObjectWithData(myData, options: []) 
    if let promtions = promoJson as? [[String: AnyObject]] { 
     for promtion in promtions { 
      if let picture = promtion["picture"] as? String { 
       myPicture.append(picture) 
      } 
      if let path = promtion["path"] as? String { 
       myPath.append(path) 
      } 
      if let label = promtion["label"] as? String { 
       mylabel.append(label) 
      } 
     } 
    } 
} catch let error as NSError { 
    print(error.debugDescription) 
} 

代替

今すぐ問題が解決されていることを、私は提案してみましょうあなたの別の方法:あなたのデータのための別々の配列の代わりに、あなたのデータを保持するオブジェクトの1つの配列を使用してください。 、

var myPromotions = [Promotion]() 

は、今、私たちはJSONをデコードすることができ、それらを保存し、それからオブジェクトを作成します。

struct Promotion { 
    let picture: String 
    let path: String 
    let label: String 
} 

そして、この構造体のインスタンスの配列:

は例えば、このような構造体を作ります配列の中で:

今、配列の内容を見ると非常に便利です:

for promo in myPromotions { 
    print(promo.label) 
    print(promo.path) 
    print(promo.picture) 
} 
+1

Structに良いアイデアをありがとう、私はそれを使用します。 – MNM

1

これはすでに配列です。

import Foundation 
import UIKit 

var myPicture = [String]() 
var myPath = [String]() 
var mylabel = [String]() 


let jsonString = "[{\"picture\" : \"Picture 1 \", \"path\": \"Path 1\" , \"label\" : \"Label 1\"}]" 
//Convert jsonString to NSData 
let myData = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 

do{ 

    let promoJson = try NSJSONSerialization.JSONObjectWithData(myData, options:.AllowFragments) as! NSArray 

     for promtions in promoJson { 

      if let picture = promtions["picture"] as? String 
      { 
       myPicture.append(picture) 

       if let path = promtions["path"] as? String 
       { 
        myPath.append(path) 

        if let label = promtions["label"] as? String 
        { 
         mylabel.append(label) 

        } 

       } 
      } 

    } 

}catch 
{ 
    print("Error with Json: \(error)") 
} 

print(myPicture.first) // "Optional("Picture 1 ")\n" 
print(myPath.first) // "Optional("Path 1")\n" 
print(mylabel.first) // "Optional("Label 1")\n" 

これは機能します。