如何将数组数据编码为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?的主要内容,如果未能解决你的问题,请参考以下文章