我正在使用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不够熟悉,无法弄清楚如何对项目列表而不是单个实例执行相同的操作。
答案 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,
);
}
}