如何在flutter中从json反序列化对象列表

时间:2018-06-27 03:03:17

标签: json dart flutter

我正在使用dart包json_serializable进行json序列化。查看flutter文档,它显示了如何反序列化单个对象,如下所示:

Future<Post> fetchPost() async {
  final response =
  await http.get('https://jsonplaceholder.typicode.com/posts/1');

  if (response.statusCode == 200) {
  // If the call to the server was successful, parse the JSON
  return Post.fromJson(json.decode(response.body));
  } else {
    // If that call was not successful, throw an error.
    throw Exception('Failed to load post');
  }
}

但是,我对dart不够熟悉,无法弄清楚如何对项目列表而不是单个实例执行相同的操作。

9 个答案:

答案 0 :(得分:21)

好吧,您的服务将处理响应主体(即地图),或相应地处理地图列表。根据您所拥有的代码,您需要核算1个项目。

如果响应主体是可迭代的,那么,如果我正确地理解了您的问题,则需要相应地解析并遍历。

示例:

Iterable l = json.decode(response.body);
List<Post> posts = l.map((Map model)=> Post.fromJson(model)).toList();

其中posts是帖子列表。

答案 1 :(得分:4)

这是另一个有关JSON解析的示例,供进一步说明。

假设我们要解析JSON对象中的项目数组。

factory YoutubeResponse.fromJSON(Map<String, dynamic> YoutubeResponseJson) 
 {

// Below 2 line code is parsing JSON Array of items in our JSON Object (YouttubeResponse)


var list = YoutubeResponseJson['items'] as List;
List<Item> itemsList = list.map((i) => Item.fromJSON(i)).toList();

return new YoutubeResponse(
    kind: YoutubeResponseJson['kind'],
    etag: YoutubeResponseJson['etag'],
    nextPageToken: YoutubeResponseJson['nextPageToken'],
    regionCode: YoutubeResponseJson['regionCode'],
    mPageInfo: pageInfo.fromJSON(YoutubeResponseJson['pageInfo']),

    // Here we are returning parsed JSON Array.

    items: itemsList);

  }

答案 2 :(得分:3)

我总是使用这种方式没有问题;

List<MyModel> myModels;
var response = await http.get("myUrl");

myModels=(json.decode(response.body) as List).map((i) =>
              MyModel.fromJson(i)).toList();

答案 3 :(得分:1)

首先,创建一个与您的json数据匹配的类,以我为例,我创建(生成)名为Img的类:

import 'dart:convert';

Img imgFromJson(String str) => Img.fromJson(json.decode(str));
String imgToJson(Img data) => json.encode(data.toJson());

class Img {
    String id;
    String img;
    dynamic decreption;

    Img({
        this.id,
        this.img,
        this.decreption,
    });

    factory Img.fromJson(Map<String, dynamic> json) => Img(
        id: json["id"],
        img: json["img"],
        decreption: json["decreption"],
    );

    Map<String, dynamic> toJson() => {
        "id": id,
        "img": img,
        "decreption": decreption,
    };
}

PS。您可以使用app.quicktype.io在dart中生成json数据类。 然后将您的帖子发送/获取到您的服务器:

Future<List<Img>> _getimages() async {
    var response = await http.get("http://192.168.115.2/flutter/get_images.php");
    var rb = response.body;

    // store json data into list
    var list = json.decode(rb) as List;

    // iterate over the list and map each object in list to Img by calling Img.fromJson
    List<Img> imgs = list.map((i)=>Img.fromJson(i)).toList();

    print(imgs.runtimeType); //returns List<Img>
    print(imgs[0].runtimeType); //returns Img

    return imgs;
}

有关更多信息,这是一篇有关Parsing complex JSON in Flutter

的文章

答案 4 :(得分:0)

您也可以像

那样做
  List< Item > itemsList= List< Item >.from(parsedListJson.map((i) => Item.fromJson(i)));

答案 5 :(得分:0)

遵循此步骤
 步骤1->创建模型类(名称为LoginResponce)click here to convert json to dart
 步骤2-> LoginResponce loginResponce=LoginResponce.fromJson(json.decode(response.body));

步骤3->现在,您可以在模型实例中获取数据(作为loginResponce)。

答案 6 :(得分:0)

例如,数组中的每个项目都是一个JSON对象。

{
  "tags": [
    {
      "name": "dart",
      "quantity": 12
    },
    {
      "name": "flutter",
      "quantity": 25
    },
    {
      "name": "json",
      "quantity": 8
    }
  ]
}

我们将需要一个表示Tag项的类。因此,我们使用这样的2个字段来创建Tag类。

class Tag {
  String name;
  int quantity;

  Tag(this.name, this.quantity);

  factory Tag.fromJson(dynamic json) {
    return Tag(json['name'] as String, json['quantity'] as int);
  }

  @override
  String toString() {
    return '{ ${this.name}, ${this.quantity} }';
  }
}

方法factory Tag.fromJson(dynamic json)将一个dynamic对象解析为一个Tag对象。在映射步骤的main()函数中将需要它。

import 'dart:convert';

main() {
  String arrayObjsText =
      '{"tags": [{"name": "dart", "quantity": 12}, {"name": "flutter", "quantity": 25}, {"name": "json", "quantity": 8}]}';

  var tagObjsJson = jsonDecode(arrayObjsText)['tags'] as List;
  List<Tag> tagObjs = tagObjsJson.map((tagJson) => Tag.fromJson(tagJson)).toList();

  print(tagObjs);
}

让我解释上面的代码。这很简单。 – jsonDecode()'tags' JSON对象转换为dynamic对象。然后,我们使用方括号['tags']来获取其中的JSON数组。 –当List返回List<dynamic>时,我们将使用map()dynamic的每个List项目更改为Tag对象。 –最后,.toList()将上面的Iterable结果转换为List<Tag>对象。

现在,如果我们运行代码,结果将是这样。

[{ dart, 12 }, { flutter, 25 }, { json, 8 }]

答案 7 :(得分:0)

这是我的Model类-

  class SuggestedMovie {
  String title;
  String genres;
  int movieId;
  SuggestedMovie({this.title, this.genres, this.movieId});
  factory SuggestedMovie.fromJson(Map<dynamic, dynamic> parsedJson) {
    return SuggestedMovie(
      movieId: parsedJson['movieId'],
      title: parsedJson['title'] as String,
      genres: parsedJson['genres'] as String,
    );
  }
}

下面的代码是将JSON响应反序列化为列表的代码

 suggestedMovie = (json.decode(jsonResponse.data) as List)
      .map((i) => SuggestedMovie.fromJson(i))
      .toList();

答案 8 :(得分:0)

<块引用> <块引用>

如何在 Flutter 中反序列化来自 json 的对象列表

import 'package:json_helpers/json_helpers.dart';

void main() {
  // String request.body
  final body = '[{"name": "Jack"}, {"name": "John"} ]';
  final personList = body.jsonList((e) => Person.fromJson(e));
  assert(personList[1].name == 'John');
  print(personList[1].name);
}

class Person {
  final String name;

  Person({required this.name});

  factory Person.fromJson(Map<String, dynamic> json) {
    return Person(
      name: json['name'] as String,
    );
  }
}