如何将数组数据编码为json?

Posted

技术标签:

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

这是请求正文:

"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: () ),
        ])

【问题讨论】:

查看this answer。它们看起来很相似 【参考方案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】:

解决方案:

    调用 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);


    创建用户触发按钮时调用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 的帮助下。

以上是关于如何将数组数据编码为json?的主要内容,如果未能解决你的问题,请参考以下文章

将字典数组编码为 JSON 时面临的问题

将 php 数组编码为 js 变量缺少一些数据? [复制]

JSON将多选行编码为数组[重复]

快速解析双 JSON 编码数组并访问它

如何将此数据编码为 JSON 中的父/子结构

如何使用 jq 将任意简单 JSON 转换为 CSV?