John Joe
John Joe

Reputation: 12803

Decode json flutter

I have this data format

message": [
{
"id": 15989,
"title": "xxx",
"body": "xxx",
"type": "abc",
"data_hash": "{\"id\":\"3098\",\"number\":1}",
}, .....]

If I write like this

print(message['data']['type']);

I can get abc, but if I write print(message['data']['data_hash']);, I get invalid arguments error. Why?

I want to get the number in data_hash.

This is the full code

 _firebaseMessaging.configure(
            onMessage: (Map<String, dynamic> message) async {
              print("===== onMessage ====");  
              try {
                print(message['data']['data_hash']);
              } catch (e) {
                print(e.toString());
              }
    });

Upvotes: 1

Views: 218

Answers (4)

Marijn Berends
Marijn Berends

Reputation: 203

I recommend to create a class to predefine the object as followed:

class Message {
  int id;
  String title;
  String body;
  String type;
  DataHash dataHash;

  message({this.id, this.title, this.body, this.type, this.dataHash});

  Message.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    title = json['title'];
    body = json['body'];
    type = json['type'];
    dataHash = json['data_hash'] != null
        ? new DataHash.fromJson(json['data_hash'])
        : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['title'] = this.title;
    data['body'] = this.body;
    data['type'] = this.type;
    if (this.dataHash != null) {
      data['data_hash'] = this.dataHash.toJson();
    }
    return data;
  }
}

class DataHash {
  String id;
  String number;

  DataHash({this.id, this.number});

  DataHash.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    number = json['number'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['number'] = this.number;
    return data;
  }
}

You can call Message.fromJson(data) to decode.

Messsage message = Message.fromJson(data);
print(message.dataHash.number);

Upvotes: 1

ibrahimkarahan
ibrahimkarahan

Reputation: 3015

data_hash row is a json. So you need to decode that row for use.

final data_hash_map = jsonDecode(message['data']['data_hash']);
print(data_hash_map); // { "id": 3098, "number": 1 }
print(data_hash_map["number"]); // for number

Upvotes: 1

Prasath S
Prasath S

Reputation: 4426

I hope this will work correctly

class _HomeState extends State<Mytimeoff> {

      List<Map> list = [];
      Map leaveRoot ={};

      void getList() async {
        var data = await http
            .get('https:your api link');
        leaveRoot = Map.from(json.decode(data.body));

        setState(() {
          for (Map js in leaveRoot['leavetype']) {
            list.add(js);
          }
        });
        print(jsonData);
      }

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


      @override
      Widget build(BuildContext context) {
        return Scaffold();
    }
    }

Upvotes: 0

Murat Aslan
Murat Aslan

Reputation: 1580

Decode your json as below

 Map<String, dynamic> jsonData = jsonDecode(message)

Upvotes: 1

Related Questions