2013-12-20 226 views
3

我正在尋找將json映射到對象的某個方向。我試圖使用web api的實時數據。當我運行代碼時,出現以下錯誤:類'_LinkedHashMap'沒有實例getter'迭代器'。將json映射到飛鏢對象

這裏就是我想要做的事:

import 'package:angular/angular.dart'; 
import 'dart:convert'; 


@NgController(
    selector: '[movies]', 
    publishAs: 'ctrl' 
) 
class MoviesController { 

    // vars 
    bool moviesLoaded = false; 
    String nameToSearch = 'life'; 
    Http _http; 
    List<MovieBrief> movies = []; 

// constructor 
    MoviesController(Http this._http) { 
    _loadData(); 
    } 

// functions 
    void _loadData() { 
    moviesLoaded = false; 

// _http.get('http://www.omdbapi.com/?s=' + nameToSearch) 
    _http.get('movies_briefs.json') 
    .then((HttpResponse response) { 

     for (Map mb in response.data) { 
     movies.add(new MovieBrief.fromJsonMap(mb)); 
     } 

     moviesLoaded = true; 
    }, 
    onError: (Object obj) { 
     print(obj); 
     } 
    ); 
    } 
} 

class MovieBrief { 
    String title; 
    String year; 
    String imdbId; 
    String type; 

    MovieBrief(this.title, this.year, this.imdbId, this.type); 

    String toJsonString() { 
    Map data = {"Search": [ 
     { 
      "Title" : title, 
      "Year" : year, 
      "imdbID" : imdbId, 
      "Type" : type 
     }]}; 
    return JSON.encode(data); 
    } 

    factory MovieBrief.fromJsonMap(Map json) { 
    return new MovieBrief(json['Title'], json['Year'], json['imdbID'], json['Type']); 
    } 
} 

下面是由Web API返回的JSON結果的樣本:

{ 
    "Search": [ 
     { 
      "Title": "Life of Pi", 
      "Year": "2012", 
      "imdbID": "tt0454876", 
      "Type": "movie" 
     }, 
     { 
      "Title": "Life Is Beautiful", 
      "Year": "1997", 
      "imdbID": "tt0118799", 
      "Type": "movie" 
     }, 
     { 
      "Title": "Life of Brian", 
      "Year": "1979", 
      "imdbID": "tt0079470", 
      "Type": "movie" 
     }, 
     { 
      "Title": "It's a Wonderful Life", 
      "Year": "1946", 
      "imdbID": "tt0038650", 
      "Type": "movie" 
     }, 
     { 
      "Title": "A Bug's Life", 
      "Year": "1998", 
      "imdbID": "tt0120623", 
      "Type": "movie" 
     }, 
     { 
      "Title": "A Bug's Life", 
      "Year": "1998", 
      "imdbID": "tt0174716", 
      "Type": "movie" 
     }, 
     { 
      "Title": "The Tree of Life", 
      "Year": "2011", 
      "imdbID": "tt0478304", 
      "Type": "movie" 
     }, 
     { 
      "Title": "The Life Aquatic with Steve Zissou", 
      "Year": "2004", 
      "imdbID": "tt0362270", 
      "Type": "movie" 
     }, 
     { 
      "Title": "Lara Croft Tomb Raider: The Cradle of Life", 
      "Year": "2003", 
      "imdbID": "tt0325703", 
      "Type": "movie" 
     }, 
     { 
      "Title": "Dan in Real Life", 
      "Year": "2007", 
      "imdbID": "tt0480242", 
      "Type": "movie" 
     } 
    ] 
} 
+0

有一個懸而未決的問題,使對象序列化和反序列化成爲Dart的一個組成部分。如果您希望看到這種支持,請投票:https://code.google.com/p/dart/issues/detail?id=16630 –

回答

1

你看的JSON_OBJECT包?這解析一個json字符串並在結果對象上創建屬性,在你的情況下你會說film.title,film.year等。你可以將每個json_object存儲在一個列表中。

0

我猜測response.data是一個映射,所以你不能用for循環迭代它。您需要使用response.data.keys,response.data.values,或者在地圖上使用forEach方法,該方法提供了這兩種方法。

response.data.forEach((key, value) => movies.add(Etc) 

按照對方的反應,像JSON_OBJECT也值得探討,但這是避免硬編碼字段映射的方式。