Невозможно преобразовать ответ json в список.Ошибка кастинга - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь преобразовать свой ответ json в список, но получаю сообщение об ошибке ниже.Json извлекается из карты, но необходимо преобразовать карту в список и отобразить в виде списка.

"_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>'"

Ответ Json

{"78":{"id":118,"first_name":"test","last_name":null,"email":"jignesh.test@gmail.com","phone":"","city":"null","state":"null","countrie_id":1,"location":"null","lat":"37.421998333333335","lng":"-122.08400000000002","image":"","role_id":3,"client_id":3,"coordinator_id":1,"sst_id":2,"created_at":"2018-10-08 10:59:18","updated_at":"2018-10-08 10:59:18","deleted_at":null,"status":0},
"79":{"id":119,"first_name":"Rahul test","last_name":null,"email":"rahul.test@gmail.com","phone":"","city":"null","state":"null","countrie_id":1,"location":"null","lat":"19.2284","lng":"72.85813","image":"","role_id":3,"client_id":3,"coordinator_id":1,"sst_id":2,"created_at":"2018-10-08 11:19:14","updated_at":"2018-10-08 11:19:14","deleted_at":null,"status":0},
"80":{"id":120,"first_name":"Customer Name","last_name":null,"email":"jjkkk@gmail.com","phone":"","city":"Mumbai","state":"Maharastra","countrie_id":1,"location":"virar","lat":"123","lng":"456","image":"images\/customer_image\/0hUSFUSqYAQTt57bVnnHjuQUOACECWzBOfJLWWa6.png","role_id":3,"client_id":1,"coordinator_id":1,"sst_id":2,"created_at":"2018-10-09 12:24:08","updated_at":"2018-10-09 14:03:07","deleted_at":null,"status":0},"status":"success","message":"List Fetched Successfully."}

Ниже приведен мой метод Future для вызова метода post api.

 Future<PosModelData> posList(){
  print('pos list api called');
  return networkUtil.post("http://192.168.0.46/api/v1/poslist",body:{
      "sstId":"2"
  }).then((response){
    if(response["status"]=="success"){
      print("List fetched");
      posLists=((response) as List).map((data)=>new PosModelData.fromJson(data)).toList();
      // print(response.toString());
      // print(posLists);
    }
  });
}

PosModel.dart

    class PosModelData {
  final String first_name;
  final String last_name;
  final String email;

  PosModelData({this.first_name, this.last_name, this.email});

  factory PosModelData.fromJson(Map json) {
    return new PosModelData(
      first_name: json['first_name'],
      last_name: json['last_name'],
      email: json['email'],
    );
  }
}

NetworkUtil.dart

Future<dynamic> post(String url, {Map header, body, encoding}) {
return http
    .post(url, body: body, headers: header, encoding: encoding)
    .then((http.Response response) {
  final String resBody = response.body;

  return jsonDecoder.convert(resBody);
});
}

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Боюсь, что ваша строка / ответ json не создана должным образом.

На той же самой карте у вас есть статус, а затем каждый элемент вашего списка, поэтому невозможно извлечь список.Вы можете переформатировать ответ сервера и затем получить, как показано в этом коде:

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

String responseStr = '''
{
"status":"success",
"message":"List Fetched Successfully.",
"posts":
  [
    {"id":118,"first_name":"test","last_name":null,"email":"jignesh.test@gmail.com","phone":"","city":"null","state":"null","countrie_id":1,"location":"null","lat":"37.421998333333335","lng":"-122.08400000000002","image":"","role_id":3,"client_id":3,"coordinator_id":1,"sst_id":2,"created_at":"2018-10-08 10:59:18","updated_at":"2018-10-08 10:59:18","deleted_at":null,"status":0},
    {"id":119,"first_name":"Rahul test","last_name":null,"email":"rahul.test@gmail.com","phone":"","city":"null","state":"null","countrie_id":1,"location":"null","lat":"19.2284","lng":"72.85813","image":"","role_id":3,"client_id":3,"coordinator_id":1,"sst_id":2,"created_at":"2018-10-08 11:19:14","updated_at":"2018-10-08 11:19:14","deleted_at":null,"status":0},
    {"id":120,"first_name":"Customer Name","last_name":null,"email":"jjkkk@gmail.com","phone":"","city":"Mumbai","state":"Maharastra","countrie_id":1,"location":"virar","lat":"123","lng":"456","image":"images\/customer_image\/0hUSFUSqYAQTt57bVnnHjuQUOACECWzBOfJLWWa6.png","role_id":3,"client_id":1,"coordinator_id":1,"sst_id":2,"created_at":"2018-10-09 12:24:08","updated_at":"2018-10-09 14:03:07","deleted_at":null,"status":0}
  ]
}
''';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {

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

class _MyHomePageState extends State<MyHomePage> {
  List<PosModelData> postList;

  @override
  void initState() {
    super.initState();
    getPosts();
  }

  Future<Null> getPosts() async {
    // Your http logic
    Map<String, dynamic> response = json.decode(responseStr);
    if (response["status"] == "success") {
      postList = ((response["posts"]) as List)
          .map((data) => new PosModelData.fromJson(data))
          .toList();
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(),
      body: Center(
        child: postList != null ?
        Column(
          children: <Widget>[
            new Text("${postList[0].first_name} ${postList[0].email}"),
            new Text("${postList[1].first_name} ${postList[1].email}"),
            new Text("${postList[2].first_name} ${postList[2].email}"),
          ],
        ) : CircularProgressIndicator(),
      ),
    );
  }
}

class PosModelData {
  final String first_name;
  final String last_name;
  final String email;

  PosModelData({this.first_name, this.last_name, this.email});

  factory PosModelData.fromJson(Map json) {
    return new PosModelData(
      first_name: json['first_name'],
      last_name: json['last_name'],
      email: json['email'],
    );
  }
}
0 голосов
/ 12 октября 2018

Вы предполагаете, что ваш ответ JSON представляет собой список объектов, хотя на самом деле это один объект с ключами, который отображается на PosModelData.

Вам следует либо изменить ответ сервера на что-то вроде:

[
   {
      "id":118,
      "first_name":"test",
      "last_name":null,
      ...
   },
   {
      "id":119,
      "first_name":"Rahul test",
      "last_name":null,
      ...
   }
]

или измените способ анализа ответа JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...