2017-09-30 18 views
0

This質問は私の問題を解決しません。辞書に項目を追加する

私はJSONの有効なフォーマットされた辞書を印刷することを目指していますが、forループを使用してこの辞書に項目を追加したかったのです。結果のJSONファイルは次のようになります。

"{ 
"items": [{ 
    "name":"An Item" 
    },{ 
    "name":"Item 2" 
    }] 
}" 

以下のコードは部分的に動作します。

["items": ["name": "test.md"], ["name": "file2.md"]] 

だから私は、有効なJSONに変換することができます:私はそれを返すようにしたいしかし

["test.md": ["name": "test.md"]] 

:ディレクトリがtest.mdというファイル、上記のリターンを持っている場合

func buildItem(name: String) -> [String:Any] { 
    let action : [String: Any] = [ 
      "name": name 
    ] 
    return action 
    } 

    var items : [String: Any] = [:] 
    for filename in filelist { 
    items[filename] = buildItem(name: filename) 
    } 
    print (items) 

  • 返されたエントリをbuildItemからitemsに追加するにはどうすればよいですか?

コード全体がこのpastebinにあります。

+0

この辞書に項目を追加したいのですか、辞書の配列が必要ですか? – zneak

+0

達成したいことを理解することは難しいです。期待されるJSONの結果を共有できますか? – mrfour

答えて

2

itemsキーの値として配列に追加するのではなく、別のキーの値としてbuildItemの結果を辞書に追加するのが問題です。

基本的には、あなたがしたいのはitems["items"] = [array of buildItem results]です。

だから、あなたは

var items : [String: Any] = [:] 
items["items"] = filelist.map { buildItem(name: $0) } 

でループのためにあなたを交換し、データ辞書をシリアル化し、あなたは、単に文字列のキーを持つ辞書用この単純な拡張機能を使用することができ、文字列に変換する必要があり

extension Dictionary where Key == String { 

    func toPrettyJSON() throws -> String { 

     let jsonData = try JSONSerialization.data(withJSONObject: self, 
              options: [.prettyPrinted]) 
     guard let jsonStr = String(data: jsonData, encoding: .ascii) 
      else { throw NSError.init() } 
     return jsonStr 

    } 

} 

してからJSON印刷

if let jsonStr = try? items.toPrettyJSON() { 
    print(jsonStr) 
} 

hereコード全体

1

複数の値に同じキーを使用できないため、アイテムタイプを配列に変更する必要があります。辞書では、すべてのキーが区別されます。

したがって、配列のappend関数によってファイルリストにファイル名を追加してください。

関連する問題