2017-12-30 24 views
0

スーパー初心者はこちら。 私はデータを通じてitterateとキー名によって要素を呼び出すことができるように辞書オブジェクトにそれを作る、私はファイルを読み込むしようとしています私のプロジェクトでjson to key - >値形式

[ 
    { 
     "id": "1", 
     "name": "hello", 
     "description": "aaa" 
    }, 
    { 
     "id": "2", 
     "name": "world", 
     "description": "bbb" 
    } 
] 

を埋め込まれitems_tmp.jsonという名前のこのサンプルJSONを持っています。

は、これまでのところ私は、のviewDidLoad内にこれを持っている:

let itemsListJson:String = "jsons/items_tmp" 
    guard let urlItems = Bundle.main.url(forResource: itemsListJson, withExtension: "json") else { return } 

    do{ 
     let dataItems = try Data(contentsOf: urlItems) 
     let jsonItems = try JSONSerialization.jsonObject(with: dataItems, options: .mutableContainers) 
     guard let arrayItems = jsonItems as? [Any] else {return} 
     print(arrayItems.count) 
     for i in 0 ..< arrayItems.count { 
      let max_damage = arrayItems[i] 
      print(max_damage) 
     } 
    } 
    catch{ 
     print(error) 
    } 

は、次の出力と結果:

2 
{ 
description = aaa; 
id = 1; 
name = hello; 
} 
{ 
description = bbb; 
id = 2; 
name = world; 
} 

は、だから、私は情報を取得、それはもキーである - >値形成

キーで特定の値を取得しようとしたとき

let name = arrayItems[i].name 

私が取得:

guard let arrayItems = jsonItems as? [String: Any] else {return} 

私は何のデータを取得していない:私は辞書構造に次の行を変更した場合、いずれかが一方何のメンバー名

を持っていません入力します。

その仕組みがわかりません。

すべてのヘルプは非常にあなたがどこにもそれを定義しないので、「いずれかが全くメンバー名を持っていないタイプ」を取得します

+0

私は内容を見るのに興味があります'items_tmp.json'です。単純なテキストファイルを含む –

+0

@InfinityJames:[ \t { \t \t "ID": "1"、 \t \t "名前": "こんにちは"、 \t \t "説明": "AAA" \t}、 \t { \t \t "ID": "2"、 \t \t "名前": "世界"、 \t \t "説明": "BBB" \t}] –

+2

JSONは辞書の配列です。それに応じてキャスト。 – rmaddy

答えて

2

ちょうどコード可能に準拠項目構造体を作成し、JSONデコーダにアイテム配列型を渡す:

struct Item: Codable { 
    let id: String 
    let name: String 
    let info: String 
    private enum CodingKeys: String, CodingKey { 
     case id, name, info = "description" 
    } 
} 

遊び場テスト:

let dataItems = Data(""" 
[ 
    { 
     "id": "1", 
     "name": "hello", 
     "description": "aaa" 
    }, 
    { 
     "id": "2", 
     "name": "world", 
     "description": "bbb" 
    } 
] 
""".utf8) 

do { 
    let items = try JSONDecoder().decode([Item].self, from: dataItems) 
    for item in items { 
     print("id:", item.id) 
     print("name:", item.name) 
     print("description:", item.info) 
    } 
} catch { 
    print(error) 
} 

ID:1

名:ハロー

説明:AAA

ID:2

名:世界

説明:すべての答えに

+0

データは埋め込まれたjsonファイルから来て、コードに埋め込まれていなければならないので、私の場合は実用的ではありません。 –

+0

これは簡単でしょう。 JSONSerializationを使用してファイルから読み込んだり、オブジェクトをデータに変換したりすることができます –

+0

itemsListJsonの文字列を投稿すると、デコードする方法を示すことができます –

0

おかげBBB、これは私が探していたものです。

let itemsListJson:String = "jsons/items_tmp" 
    guard let urlItems = Bundle.main.url(forResource: itemsListJson, withExtension: "json") else { return } 
    do{ 
     let dataItems = try Data(contentsOf: urlItems) 
     let jsonItems = try JSONSerialization.jsonObject(with: dataItems, options: .mutableContainers) 
     guard let arrayItems = jsonItems as? [Any] else {return} 
     for i in 0 ..< arrayItems.count { 
      let tmp = arrayItems[i] as! [String: Any] 
      print(tmp["id"]!) 
      print(tmp["name"]!) 
      print(tmp["description"]!) 
     } 
    } 
    catch{ 
     print(error) 
    } 

この私が間違ってやっていたかを理解助けました。 JSONは辞書の配列です。それに応じてキャスト。 - rmaddy 基本的に私は配列としてjsonを取得し、配列を反復し、各配列要素を辞書として扱いますので、key-> valueプロパティを使用することができます。