首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >flutter -如何在Flutter中解析带有列表的嵌套JSON结构?

flutter -如何在Flutter中解析带有列表的嵌套JSON结构?
EN

Stack Overflow用户
提问于 2020-07-09 02:04:10
回答 1查看 2.2K关注 0票数 1

这是我的JSON

代码语言:javascript
复制
{
  "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,因此我将我的模型写成这样

代码语言:javascript
复制
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'],
    );
  }
}

最后,我在窗口小部件树中编写了如下函数

代码语言:javascript
复制
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。我试着调试它,但没有成功。请帮帮忙。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-09 03:35:38

var list = parsedJson['name']行的Places.fromJson方法中,您试图在引用对象本身之前访问对象内部的列表。相反,您应该通过示例传递其中一个对象的名称,例如type-1,以这种方式传递var list = parsedJson['type-1'] as List;

但这将只返回第一个对象的列表。要获得所有对象和每个对象的名称列表,需要遍历json对象,在本例中是type-1type-2,然后遍历其列表。您可以在AllPlaces.fromJson中检查迭代。因此,您需要对代码进行一些更改,以便从json中获取所有对象。您可以尝试下面这样的代码,您可以在DartPad上进行测试

代码语言:javascript
复制
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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62800959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档