mohammad shabani
mohammad shabani

Reputation: 369

how to encode and send to server json list by dio

i have class that generate json list this is my class

class Tool{
   String Name;
   bool  selection;
   String englishName;
   Map<String, dynamic> toJson() {
     return {
      'Name': persianName,
      'selection': selection,
      'englishName': englishName
  };

 }

 }

  List<Tool> tools=new List();
 setTool(tool){
   tools.add(tool);
 }
 toolsLength(){
   return tools.length;
 }
updatetool(index,goal){
  tools[index]=goal;
}
getTool(index){
  return tools[index];
}
getAllTools(){
  return tools;
}

and this is dio library that send my list to server every thing is ok but my array is into Double quotation in other word my list is string how to pick up double quotation around of json array . if assume my json array hase

    "tools":  [{"name":"jack","selection" : false " ,"englishName":"jock"}]

result is :

    "tools": "[{"name":"jack","selection" : false " ,"englishName":"jock"}]"

how fix it this is my class for send

FormData formData = new FormData.from({
      "tools":jsonEncode(getAllTools().map((e) => e.toJson()).toList()) ,
  });
 response = await 
 dio.post("${strings.baseurl}/analyze/$username/$teacher", data: 
 formData);
print("----------> response is  :"+response.toString());

Upvotes: 1

Views: 5839

Answers (1)

chunhunghan
chunhunghan

Reputation: 54397

Edit You can paste the following code to DarPad https://dartpad.dartlang.org/ The following demo shows transform your Json String to Tool List and Convert your Tool List to JSON string again and use map.toJson

var yourresult = toolList.map((e) => e.toJson()).toList();

you can see result in picture

use FormData.from need to know what your api's correct JSON String.
Please test your web api with Postman, if you success, you will know correct format string.

In your code

FormData formData = new FormData.from({
  "tools":jsonEncode(getAllTools().map((e) => e.toJson()).toList()) ,
 });

if you are trying to to do

FormData formData = new FormData.from({
  "tools":'[{"name":"jack","selection" : false ,"englishName":"jock"}, {"name":"jack2","selection" : false ,"englishName":"jock2"}]' ,
 });

so you can get your json string first and put it in FormData

var toolsJson =  toolsToJson(toolList);

FormData formData = new FormData.from({
  "tools":toolsJson ,
 });

full demo code, you can paste to DartPad to see string and list conversion

import 'dart:async';
import 'dart:io';
import 'dart:core';
import 'dart:convert';

class Tools {
    String name;
    bool selection;
    String englishName;

    Tools({
        this.name,
        this.selection,
        this.englishName,
    });

    factory Tools.fromJson(Map<String, dynamic> json) => new Tools(
        name: json["name"],
        selection: json["selection"],
        englishName: json["englishName"],
    );

    Map<String, dynamic> toJson() => {
        "name": name,
        "selection": selection,
        "englishName": englishName,
    };
}

main() {  

List<Tools> toolsFromJson(String str) => new List<Tools>.from(json.decode(str).map((x) => Tools.fromJson(x)));

String toolsToJson(List<Tools> data) => json.encode(new List<dynamic>.from(data.map((x) => x.toJson())));

var toolsStr = '[{"name":"jack","selection" : false ,"englishName":"jock"}, {"name":"jack2","selection" : false ,"englishName":"jock2"}]';


var toolList =   toolsFromJson(toolsStr);

var toolsJson =  toolsToJson(toolList); 
print("toolsJson ${toolsJson} \n");

var toolsmap =  toolList[0].toJson();

print("toolsmap ${toolsmap.toString()}\n");  

var yourresult = toolList.map((e) => e.toJson()).toList();

print(yourresult.toString());   

}

enter image description here

you can paste your JSON string to https://app.quicktype.io/, you will get correct Dart class

correct JSON string of your sample. in false keyword followed by a " cause JSON string parsing error.

[
    {"name":"jack",
     "selection" : false ,
     "englishName":"jock"
    }
]

code to parse JSON string and encode to List, use toJson will convert to JSON string you need to send with dio form

// To parse this JSON data, do
//
//     final tools = toolsFromJson(jsonString);

import 'dart:convert';

List<Tools> toolsFromJson(String str) => new List<Tools>.from(json.decode(str).map((x) => Tools.fromJson(x)));

String toolsToJson(List<Tools> data) => json.encode(new List<dynamic>.from(data.map((x) => x.toJson())));

class Tools {
    String name;
    bool selection;
    String englishName;

    Tools({
        this.name,
        this.selection,
        this.englishName,
    });

    factory Tools.fromJson(Map<String, dynamic> json) => new Tools(
        name: json["name"],
        selection: json["selection"],
        englishName: json["englishName"],
    );

    Map<String, dynamic> toJson() => {
        "name": name,
        "selection": selection,
        "englishName": englishName,
    };
}

Upvotes: 3

Related Questions