Search code examples
flutterdarthttpget

How can I map items from json with http get method flutter?


I`m trying to use an http get method in flutter, but my json is returned like this:

{"items":[{"id":1,"nome":"Ricardo","telefone":"(14) 99797-5621"}],"hasMore":false,"limit":25,"offset":0,"count":1,"links":[{"rel":"self","href":"http://172.16.30.120:8080/ords/apiteste/integrafoods/users"},{"rel":"describedby","href":"http://172.16.30.120:8080/ords/apiteste/metadata-catalog/integrafoods/item"},{"rel":"first","href":"http://172.16.30.120:8080/ords/apiteste/integrafoods/users"}]}

And i`m trying to retrieve info this way:

Future<void> _loadUsers() async {
    final response = await http.get(
      Uri.parse(_url),
      headers: <String, String>{
        'Content-Type': 'application/json; charset=UTF-8',
      },
    );
    if (response.body == 'null') return;
    Map<String, dynamic> data = jsonDecode(response.body);
    data.forEach(
      (items, userData) {
        teste.add(
          AppUser(
            id: items,
            login: userData['login'],
            phoneNumber: userData['telefone'],
          ),
        );
      },
    );
    print(_teste.length);
  }

But it's not working, it throws error: "[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: type 'String' is not a subtype of type 'int' of 'index'".

But if i use code this way, it returns all parameters from the json:

Future<void> _loadUsers() async {
    final response = await http.get(
      Uri.parse(_url),
      headers: <String, String>{
        'Content-Type': 'application/json; charset=UTF-8',
      },
    );
    if (response.body == 'null') return;
    Map<String, dynamic> data = jsonDecode(response.body);
    data.forEach(
      (items, userData) {
        teste.add(
          AppUser(
            login: userData['items'].toString(),
          ),
        );
      },
    );
    print(_teste.length);
  }

How can i map this "items" json so i get each parameter separetadely?

class AppUser {
  // final String CPF;
  final String id;
  final String? login;
  final String? name;
  final String? email;
  final String? situation;
  final String? phoneNumber;
  final String? password;
  final String? inclusionDt;
  final String? inclusionUs;
  final String? altDt;
  final String? altUs;
  final String company;

  const AppUser({
    // required this.CPF,
    required this.id,
    this.login,
    this.name,
    this.email,
    this.situation,
    this.phoneNumber,
    this.password,
    this.inclusionDt,
    this.inclusionUs,
    this.altDt,
    this.altUs,
    this.company = 'GTFoods',
  });
}


Solution

  • You can use this model class

    import 'dart:convert';
    
    class MyItem {
      final int id;
      final String? nome;
      final String? telefone;
      MyItem({
        required this.id,
        required this.nome,
        required this.telefone,
      });
    
      Map<String, dynamic> toMap() {
        final result = <String, dynamic>{};
    
        result.addAll({'id': id});
        if (nome != null) {
          result.addAll({'nome': nome});
        }
        if (telefone != null) {
          result.addAll({'telefone': telefone});
        }
    
        return result;
      }
    
      factory MyItem.fromMap(Map<String, dynamic> map) {
        return MyItem(
          id: int.tryParse(map['id'].toString()) ?? 0,
          nome: map['nome'],
          telefone: map['telefone'],
        );
      }
    
      String toJson() => json.encode(toMap());
    
      factory MyItem.fromJson(String source) => MyItem.fromMap(json.decode(source));
    }
    

    Try using

    final  data = jsonDecode(response.body)['items'] as List?;
    
    if (data  != null) {
        final items = data.map((e) => MyItem.fromJson(e)).toList();
        print(data);
      }