使用地图类型

时间:2019-07-02 15:07:21

标签: json flutter

我不明白如何解析json以列出列表或flutter中的任何类型

https://jsonplaceholder.typicode.com/photos <=这是我使用的json示例

并且该信息被[],{}

包围
final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
  List<Photo> simple =
      parsed.map<Photo>((json) => Photo.fromJson(json)).toList();

我希望json.decode.cast()工作时,解析后包含每个对象,但是 当我打印解析后,它只是一个像[~~~]的数组 为什么他们在Map <>中使用强制转换方法?

3 个答案:

答案 0 :(得分:0)

jsonDecode已经为您提供了列表对象,因此您可以优化代码。

在您的情况下,不要使用

final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
  List<Photo> simple =
      parsed.map<Photo>((json) => Photo.fromJson(json)).toList();

尝试使用

final List<Photo> simple = jsonDecode(responseBody).map((item) => Photo(title: item.title)).toList()

避免使用fromJson函数

答案 1 :(得分:0)

  
    

我不明白如何解析json以列出列表或flutter中的任何类型

  

此代码可以帮助您了解其工作原理。

import 'dart:convert';

import 'json_objects.dart';

import 'package:http/http.dart' as _http;

Future<void> main() async {
  final url = 'https://jsonplaceholder.typicode.com/photos';
  final response = await _http.get(url);
  if (response.statusCode == 200) {
    final json =
        (jsonDecode(response.body) as List).cast<Map<String, dynamic>>();
    final photos = json.map((e) => Photo.fromJson(e)).cast<Photo>();
    for (final photo in photos) {
      print("Id: ${photo.id}");
      print("Id: ${photo.title}");
    }
  }
}

结果。

Id: 1
Id: accusamus beatae ad facilis cum similique qui sunt
Id: 2
Id: reprehenderit est deserunt velit ipsam
Id: 3
Id: officia porro iure quia iusto qui ipsa ut modi
Id: 4
Id: culpa odio esse rerum omnis laboriosam voluptate repudiandae
Id: 5
Id: natus nisi omnis corporis facere molestiae rerum in
Id: 6
Id: accusamus ea aliquid et amet sequi nemo
Id: 7
Id: officia delectus consequatur vero aut veniam explicabo molestias
Id: 8
Id: aut porro officiis laborum odit ea laudantium corporis
Id: 9
Id: qui eius qui autem sed
Id: 10
Id: beatae et provident et ut vel
...
...

使用的JSON数据模型。

class Photo {
  final int albumId;
  final int id;
  final String thumbnailUrl;
  final String title;
  final String url;

  Photo({this.albumId, this.id, this.thumbnailUrl, this.title, this.url});

  factory Photo.fromJson(Map<String, dynamic> json) {
    return Photo(
      albumId: json['albumId'] as int,
      id: json['id'] as int,
      thumbnailUrl: json['thumbnailUrl'] as String,
      title: json['title'] as String,
      url: json['url'] as String,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'albumId': albumId,
      'id': id,
      'thumbnailUrl': thumbnailUrl,
      'title': title,
      'url': url,
    };
  }
}

/*
Photo:
  "albumId": int
  "id": int
  "title": String
  "url": String
  "thumbnailUrl": String
*/

答案 2 :(得分:0)

您不需要转换数组,因为它们已经是对象列表。

您可以使用以下方法获取照片对象的列表:

Future<String> getPhotos() async {
  var response = await http.get(
      'https://jsonplaceholder.typicode.com/photos');
  if (response.statusCode == 200) {
    var parsed = json.decode(response.body);
      List<Photo> simple = parsed.map<Photo>((json) => Photo.fromJson(json)).toList();
      print(simple);
  }
}

这是所使用的照相课。

class Photo {
  final int albumId;
  final int id;
  final String title;
  final String url;
  final String thumbnailUrl;

  Photo(
      {this.albumId, this.id, this.title, this.url, this.thumbnailUrl});

  factory Photo.fromJson(Map<dynamic, dynamic> json) {
    return Photo(albumId: json['albumId'],
      id: json['id'],
      title: json['title'],
      url: json['url'],
      thumbnailUrl: json['thumbnailUrl'],
    );
  }
}