这是我的JSON
{
"type-1":[
{
"name": "type-1-1"
},
{
"name": "type-1-2"
}
],
"type-2": [
{
"name": "type-2-1"
},
{
"name": "type-2-2"
},
{
"name": "type-2-3"
}
]
}我想解析这个JSON,因此我将我的模型写成这样
class Places {
final List<PlaceName> names;
Places({this.names});
factory Places.fromJson(Map<String, dynamic> parsedJson){
var list = parsedJson['name'] as List;
List<PlaceName> placeList = list.map((i) => PlaceName.fromJson(i)).toList();
return Places(
names: placeList
);
}
}
class PlaceName {
final String name;
PlaceName({this.name});
factory PlaceName.fromJson(Map<String, dynamic> parsedJson){
return PlaceName(
name : parsedJson['name'],
);
}
}最后,我在窗口小部件树中编写了如下函数
Future<String> _loadAllPlaces() async {
return await rootBundle.loadString('assets/location.json');
}
Future loadPlaces() async {
String jsonString = await _loadAllPlaces();
final jsonResponse = json.decode(jsonString);
PlaceName place = new PlaceName.fromJson(jsonResponse);
print(place);
print(place.name);
return place;
}因此,当我在FutureBuilder中调用loadPlaces()时,它返回null。我试着调试它,但没有成功。请帮帮忙。提前谢谢。
发布于 2020-07-09 03:35:38
在var list = parsedJson['name']行的Places.fromJson方法中,您试图在引用对象本身之前访问对象内部的列表。相反,您应该通过示例传递其中一个对象的名称,例如type-1,以这种方式传递var list = parsedJson['type-1'] as List;。
但这将只返回第一个对象的列表。要获得所有对象和每个对象的名称列表,需要遍历json对象,在本例中是type-1和type-2,然后遍历其列表。您可以在AllPlaces.fromJson中检查迭代。因此,您需要对代码进行一些更改,以便从json中获取所有对象。您可以尝试下面这样的代码,您可以在DartPad上进行测试
import 'dart:convert';
String jsonString = '{"type-1":[{"name": "type-1-1"},{"name": "type-1-2"}],"type-2": [{"name": "type-2-1"},{"name": "type-2-2"},{"name": "type-2-3"}]}';
class AllPlaces {
List<PlaceName> placeNames;
AllPlaces({this.placeNames});
AllPlaces.fromJson(Map<String, dynamic> json) {
placeNames = new List<PlaceName>();
//Iterates over the json objects.
json.forEach((type, list) {
//Iterates over the list of each object.
json[type].forEach((list) {
//Creates an instance of PlaceName and adds to the placeNames list.
placeNames.add(new PlaceName.fromJson(list));
});
});
}
}
class PlaceName {
String name;
PlaceName({this.name});
PlaceName.fromJson(Map<String, dynamic> json) {
name = json['name'];
}
}
Future loadPlaces() async {
//String jsonString = await _loadAllPlaces();
final jsonResponse = json.decode(jsonString);
AllPlaces allPlaces = new AllPlaces.fromJson(jsonResponse);
//Print the names of each object in the console
allPlaces.placeNames.forEach((place) => print(place.name));
return allPlaces;
}
void main() {
loadPlaces();
}https://stackoverflow.com/questions/62800959
复制相似问题