我将使用真实的json。首先,我应该运行用Flask编写的项目,然后使用本地主机来获取数据。
这是我使用的真正的杰森

{
   "devices":[
      {
         "device_desc":"cooler",
         "device_title":"cooler",
         "functions":[
            {
               "device_id":1,
               "function_desc":"pomp",
               "function_title":"pomp",
               "status":1
            },
            {
               "device_id":1,
               "function_desc":"less",
               "function_title":"less",
               "status":1
            },
            {
               "device_id":1,
               "function_desc":"up",
               "function_title":"up",
               "status":1
            }
         ],
         "image_path":"fdfdfsf",
         "status_id":1,
         "statuss":{
            "status_desc":"device is on",
            "status_title":"on"
         }
      },
      {
         "device_desc":"panke",
         "device_title":"panke",
         "functions":[
            {
               "device_id":2,
               "function_desc":"less",
               "function_title":"pomp",
               "status":2
            },
            {
               "device_id":2,
               "function_desc":"less",
               "function_title":"less",
               "status":2
            }
         ],
         "image_path":"vfx",
         "status_id":2,
         "statuss":{
            "status_desc":"device is off",
            "status_title":"off"
         }
      }
   ]
}

这是我的代码:

这些是用于定义json属性的数据模型:
class Base{
//the type of our object is the array
  List<Device> _devices;


  Base(this._devices);

  List<Device> get devices => _devices;

  set devices(List<Device> value) {
    _devices = value;
  }
}

class Device {
  String _device_desc,_device_title,_image_path;
  int _status_id;
  List<function> _functions;
  List<Status> _statuss ;

  Device(this._device_desc, this._device_title, this._image_path,
      this._status_id, this._functions, this._statuss);

  List<Status> get statuss => _statuss;

  set statuss(List<Status> value) {
    _statuss = value;
  }

  List<function> get functions => _functions;

  set functions(List<function> value) {
    _functions = value;
  }

  int get status_id => _status_id;

  set status_id(int value) {
    _status_id = value;
  }

  get image_path => _image_path;

  set image_path(value) {
    _image_path = value;
  }

  get device_title => _device_title;

  set device_title(value) {
    _device_title = value;
  }

  String get device_desc => _device_desc;

  set device_desc(String value) {
    _device_desc = value;
  }
}

class Status {
  String _status_desc, _status_title;

  Status(this._status_desc, this._status_title);

  get status_title => _status_title;

  set status_title(value) {
    _status_title = value;
  }

  String get status_desc => _status_desc;

  set status_desc(String value) {
    _status_desc = value;
  }}
class function {
   String _function_desc, _function_title;
   int _device_id, _status;

   function(this._function_desc, this._function_title, this._device_id,
       this._status);

   get status => _status;

   set status(value) {
     _status = value;
   }

   int get device_id => _device_id;

   set device_id(int value) {
     _device_id = value;
   }

   get function_title => _function_title;

   set function_title(value) {
     _function_title = value;
   }

   String get function_desc => _function_desc;

   set function_desc(String value) {
     _function_desc = value;
   }}

这是有状态类:
class MyHomePage extends StatefulWidget {
  var title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {


  Future<Base> _getBase() async {
var data = await http.get(Uri.encodeFull("http://192.168.1.111:5000/mobile-home"));
var jsonData = json.decode(data.body);

Base base = Base(jsonData);
  return Base(jsonData[0]);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: Container(
        child: FutureBuilder(
          future: _getBase(),
          builder: (BuildContext context,  AsyncSnapshot snapshot) {
            if (snapshot.data == null) {
              return Container(
                child: Center(
                  child: Text("Loading..."),
                ),
              );
            } else {
              return ListView.builder(
                itemCount: snapshot.data.devices.length,
                itemBuilder: (BuildContext context, int index) {
                  snapshot.data.devices.map<Widget>((devices){
                    return ListTile(
                      subtitle: Text(devices[index].device_desc.toString()),
                      title: Text(devices[index].device_title),
                      /*leading: CircleAvatar(
                      // ignore: argument_type_not_assignable
                      backgroundImage:  NetworkImage(snapshot.data[index].thumbnailUrl),
                    )*/
                    );
                  }
                  );

                },
              );
            }
          },
        ),
      ),
    );
  }
}

调试时出现错误:
 "type 'List<dynamic>' is not a subtype of type 'List<Device>'"

我无法从json获取数据。

最佳答案

关于如何在Flutter中解析复杂的JSON有一个很好的article。快速摘要...

简单的东西:

{
  "id":"487349",
  "name":"Pooja Bhaumik",
  "score" : 1000
}

变成...
class Student{
  String studentId;
  String studentName;
  int studentScores;

  Student({
    this.studentId,
    this.studentName,
    this.studentScores
 });

  factory Student.fromJson(Map<String, dynamic> parsedJson){
    return Student(
      studentId: parsedJson['id'],
      studentName : parsedJson['name'],
      studentScores : parsedJson ['score']
    );
  }

}

您将创建一个新的Student对象,例如Student.fromJson(your_parsed_json)

子对象以类似的方式工作。对于父对象内的每个对象,您将创建一个新的Dart对象,每个对象都具有自己的fromJson解析器。然后,在父工厂内部,您可以从fromJson方法中调用它(像这样)...这也适用于对象列表。
  factory Student.fromJson(Map<String, dynamic> parsedJson){
    return Student(
      studentId: parsedJson['id'],
      studentName : parsedJson['name'],
      studentScores : Teacher.fromJson(parsedJson['teacher'])
  );

09-11 15:10