Как кодировать данные массива в json? - PullRequest
0 голосов
/ 02 апреля 2020
  1. Говорит, что я создал ListView.Builder.
  2. У меня есть кнопка "Добавить работу", чтобы добавить работу в список.
  3. И теперь я добавил в список 2 вакансии. Я хочу отправить данные этого массива через API.
  4. Моя проблема заключается в том, как закодировать массив карт и правильно передать их?
  5. Это изображение описывает то, что я пытаюсь сказать.
  6. Большое спасибо заранее.

И это тело запроса:

{"batch":
 [
  {"sector_id":1,"company":"Company"},
  {"sector_id":2,"company":"Organization"},
  ......if has more
 ]
}

И у меня есть эта модель :

class Occupations {
  List<Batch> batch;

  Occupations({this.batch});

  Occupations.fromJson(Map<String, dynamic> json) {
    if (json['batch'] != null) {
      batch = new List<Batch>();
      json['batch'].forEach((v) {
        batch.add(new Batch.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.batch != null) {
      data['batch'] = this.batch.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Batch {
  int sectorId;
  String company;

  Batch({this.sectorId, this.company});

  Batch.fromJson(Map<String, dynamic> json) {
    sectorId = json['sector_id'];
    company = json['company'];
  }

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

Мой POST Метод:

createOccupations(int id, String company)async{
var _sectorsUrl = '$_hostUrl/occupations';
String _body ='{"batch":[{"sector_id":id,"company":"$company"}]}';
final _response = await post(
  _sectorsUrl,
  body: _body,
  headers: {
    'Content-type':'application/json',
    'Accept':'application/json',
  }
);
if (_response.statusCode==200) {
  return Occupations.fromJson(json.decode(_response.body));
} else {
  print(_response.statusCode);
  print(_data);
}
}

И это мой UI :

Column(children: <Widget>[
          Expanded(
              child: ListView.builder(
                  itemCount: jobCount,
                  itemBuilder: (context, index) {
                    _sectorIdController.add(new TextEditingController());
                    _companyNameController.add(new TextEditingController());
                    return Container(
                      margin: margin10,
                      padding: padding10,
                      decoration: BoxDecoration(
                        border: Border.all(color:black)
                      ),
                      child: Column(
                        children: <Widget>[
                          TextField(
                            decoration: InputDecoration(labelText: 'Sector Id'),
                            controller: _sectorIdController[index],
                          ),
                          TextField(
                              decoration:
                                  InputDecoration(labelText: 'Company Name'),
                              controller: _companyNameController[index]),
                        ],
                      ),
                    );
                  })),
          RaisedButton(
              child: Text('Add Job'),
              onPressed: () {
                setState(() {
                  jobCount++;
                });
              }),
          RaisedButton(child: Text('Submit Occupations'), onPressed: () {}),
        ])

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Решение:

  1. Мне нужно возвращать закодированный массив json при вызове API. Следовательно, мне нужно закодировать 'данные' .
createOccupations(int id, var data)async{
var _sectorsUrl = '$_hostUrl/occupations';
final _response = await post(
 _sectorsUrl,
 body: jsonEncode({"batch":data}), //jsonEncode to encode the data to json
 headers: {
   'Content-type':'application/json',
   'Accept':'application/json',
 }
);
if (_response.statusCode==200) {
 return Occupations.fromJson(json.decode(_response.body));
} else {
 print(_response.statusCode);
 print(_data);
}
}
Создание функции для вызова API при нажатии кнопки запуска пользователя.
void _createJobs() {
    setState(() {
      List<Batch> _listBatch = List<Batch>();
      var newList;
      for (var i = 0; i < jobCount; i++) {
        Batch _batch = Batch(sector_id:_sectorIdController[i].text,company: _companyNameController[i].text);
        _listBatch.addAll([_batch]);
      }
      newList = _listBatch;
      _jobAPI.createOccupation(context, newList); // I do not need to encode the data here because when I pass it, I already did encoding as show above.
    });
  }
0 голосов
/ 02 апреля 2020
Значение
 String jsonEncodedString=json.encode(value);

может быть объектом любого типа, например list, map, int, string, double и т. Д. Например:

 String jsonEncodedString=json.encode({'hello':'i am a map'});

Вы можете передать закодированную строку json через API

...