【问题标题】:How to encode array data to json?如何将数组数据编码为json?
【发布时间】:2020-07-14 16:05:43
【问题描述】:
  1. 说我创建了一个 ListView.Builder。
  2. 我有一个“添加作业”按钮可以将作业添加到列表中。
  3. 现在让我在列表中添加了 2 个工作。我想通过 API 提交这个数组数据。
  4. 我的问题是如何对地图数组进行编码并正确传递它们?
  5. This image describes what I'm trying to tell.
  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: () {}),
        ])

【问题讨论】:

标签: json flutter dart encode


【解决方案1】:
 String jsonEncodedString=json.encode(value);

value 可以是 list、map、int、string、double 等任何对象 示例:

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

你可以通过API传递json编码的字符串

【讨论】:

  • 我还是有点困惑,Sasi Zets,你介意指导我在我的 POST 方法中也应该做哪些改变吗?
【解决方案2】:

解决方案:

  1. 调用 API 时需要返回一个编码的 json 数组。因此,我需要对 'data' 进行编码。
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);
}
}
  1. 创建用户触发按钮时调用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.
    });
  }

【讨论】:

  • 在 Sasi Zets 的帮助下。
猜你喜欢
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多