Flutter Dart/FLATTER-将json嵌套到数据表
我试图将以下json放入一个数据表(CFTable)。json的结构是map>。我有一个COA类来处理内部映射(map),还有一个TransposedCF类来从该映射(map)生成映射。我不想硬编码外部地图(“采集”、“BP提升”…等)或内部地图(“2019”、“2020”…等)的字符串键,因为它们会不断变化。我对TransposeCf类的fromJson方法有困难(因此?) 另外,在我构建这个类之后,我想在一个表中使用它,但是那里有很多错误 JSON: 颤振:Flutter Dart/FLATTER-将json嵌套到数据表,flutter,dart,Flutter,Dart,我试图将以下json放入一个数据表(CFTable)。json的结构是map>。我有一个COA类来处理内部映射(map),还有一个TransposedCF类来从该映射(map)生成映射。我不想硬编码外部地图(“采集”、“BP提升”…等)或内部地图(“2019”、“2020”…等)的字符串键,因为它们会不断变化。我对TransposeCf类的fromJson方法有困难(因此?) 另外,在我构建这个类之后,我想在一个表中使用它,但是那里有很多错误 JSON: 颤振: import 'package:
import 'package:flutter/material.dart';
class COA {
final Map<String, double> values;
const COA({@required this.values});
factory COA.fromJson(Map json) {
final values = json['values'];
return COA(values: values);
}
}
class TransposedCF {
final String assetname;
final Map<String, COA> coas;
TransposedCF({this.assetname, this.coas});
factory TransposedCF.fromJson(String name, List json) {
return TransposedCF(
assetname: name,
coas: ?,
);
}
}
class CFTable extends StatelessWidget {
final TransposedCF cf;
CFTable({Key key, this.cf}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Text("OGANICA"),
DataTable(columns: _buildColumns(), rows: _buildDataRows()),
],
);
}
List<DataColumn> _buildColumns() {
final years = cf.coas.first.values.keys.toList()..sort();
return [
DataColumn(label: Text(cf.assetname)),
for (String year in years) DataColumn(label: Text("$year"))
];
}
List<DataRow> _buildDataRows() {
return cf.coas.map<DataRow>((coa) {
final years = coa.values.keys.toList()..sort();
return DataRow(cells: [
DataCell(Text(coa.name)),
...years.map<DataCell>((year) {
final value = coa.values[year];
//TODO format value
return DataCell(Text(value.toString()));
})
]);
}).toList(growable: false);
}
}
导入“包装:颤振/材料.省道”;
COA类{
最终地图值;
const COA({@required this.values});
工厂COA.fromJson(映射json){
最终值=json['values'];
返回COA(值:值);
}
}
类转置{
最终字符串资产名称;
最终地图coas;
TransposedCF({this.assetname,this.coas});
factory TransposedCF.fromJson(字符串名称,列表json){
回程转置(
资产名称:名称,
coas:?,
);
}
}
类CFTable扩展了无状态小部件{
最终转座cf;
CFTable({Key-Key,this.cf}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
文本(“OGANICA”),
数据表(列:_buildColumns(),行:_buildDataRows()),
],
);
}
列表_buildColumns(){
最后年份=cf.coas.first.values.keys.toList()…sort();
返回[
DataColumn(标签:Text(cf.assetname)),
对于(以年为单位的字符串年份)数据列(标签:文本($year))
];
}
列表_buildDataRows(){
返回cf.coas.map((coa){
最后年份=coa.values.keys.toList()…sort();
返回数据行(单元格:[
数据单元(文本(coa.name)),
…年。地图((年){
最终价值=成本价值[年度];
//TODO格式值
返回数据单元(文本(value.toString());
})
]);
}).toList(可增长:假);
}
}
您可以复制粘贴运行下面的完整代码步骤1:在本演示中,将原始json字符串使用到相关映射
类
有效负载
步骤2:将此
有效载荷
传输到年度数据列表
步骤3:使用
json_table
使用列表
年度数据
工作演示
代码片段
class Payload {
Map<String, double> acquisition;
Map<String, double> bpUplift;
Map<String, double> capex;
...
class YearData {
String year;
double acquisition;
double bpUplift;
double capex;
...
void transfer() {
Payload payload = payloadFromJson(jsonString);
List<YearData> yearDataList = [];
for (var val in payload.acquisition.keys) {
var year = val;
var acquisition = payload.acquisition[val];
var capex = payload.capex[val];
var bpUplift = payload.bpUplift[val];
yearDataList.add(YearData(
year: year,
acquisition: acquisition,
bpUplift: bpUplift,
capex: capex));
}
jsonSample = yearDataToJson(yearDataList);
}
类有效载荷{
地图采集;
地图;地形抬升;
Map资本支出;
...
类年数据{
弦年;
双重收购;
双重抬升;
双重资本支出;
...
无效转让(){
有效载荷=payloadFromJson(jsonString);
列表年份数据列表=[];
for(有效载荷.acquisition.keys中的var val){
var年=val;
var采集=有效载荷。采集[val];
var资本支出=有效载荷。资本支出[val];
var BPUpgration=有效载荷。BPUpgration[val];
yearDataList.add(YearData(
年份:年份,,
收购:收购,
bpuplation:bpuplation,
资本支出:资本支出);
}
jsonSample=yearDataToJson(yearDataList);
}
完整代码
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:json_table/json_table.dart';
import 'dart:convert';
Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));
String payloadToJson(Payload data) => json.encode(data.toJson());
class Payload {
Map<String, double> acquisition;
Map<String, double> bpUplift;
Map<String, double> capex;
Payload({
this.acquisition,
this.bpUplift,
this.capex,
});
factory Payload.fromJson(Map<String, dynamic> json) => Payload(
acquisition: Map.from(json["Acquisition"])
.map((k, v) => MapEntry<String, double>(k, v.toDouble())),
bpUplift: Map.from(json["BP Uplift"])
.map((k, v) => MapEntry<String, double>(k, v.toDouble())),
capex: Map.from(json["Capex"])
.map((k, v) => MapEntry<String, double>(k, v.toDouble())),
);
Map<String, dynamic> toJson() => {
"Acquisition": Map.from(acquisition)
.map((k, v) => MapEntry<String, dynamic>(k, v)),
"BP Uplift":
Map.from(bpUplift).map((k, v) => MapEntry<String, dynamic>(k, v)),
"Capex": Map.from(capex).map((k, v) => MapEntry<String, dynamic>(k, v)),
};
}
List<YearData> yearDataFromJson(String str) =>
List<YearData>.from(json.decode(str).map((x) => YearData.fromJson(x)));
String yearDataToJson(List<YearData> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class YearData {
String year;
double acquisition;
double bpUplift;
double capex;
YearData({
this.year,
this.acquisition,
this.bpUplift,
this.capex,
});
factory YearData.fromJson(Map<String, dynamic> json) => YearData(
year: json["year"],
acquisition: json["Acquisition"],
bpUplift: json["BPUplift"],
capex: json["Capex"],
);
Map<String, dynamic> toJson() => {
"year": year,
"Acquisition": acquisition,
"BPUplift": bpUplift,
"Capex": capex,
};
}
class SimpleTable extends StatefulWidget {
@override
_SimpleTableState createState() => _SimpleTableState();
}
class _SimpleTableState extends State<SimpleTable> {
String jsonString = '''
{
"Acquisition": {
"2019": -78600000,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 77527013.89465855
},
"BP Uplift": {
"2019": 0,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 0
},
"Capex": {
"2019": 0,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 0
}
}
''';
String jsonSample = "";
bool toggle = true;
List<YearData> yearDataList = [];
@override
void initState() {
// TODO: implement initState
transfer();
super.initState();
}
void transfer() {
Payload payload = payloadFromJson(jsonString);
List<YearData> yearDataList = [];
for (var val in payload.acquisition.keys) {
var year = val;
var acquisition = payload.acquisition[val];
var capex = payload.capex[val];
var bpUplift = payload.bpUplift[val];
yearDataList.add(YearData(
year: year,
acquisition: acquisition,
bpUplift: bpUplift,
capex: capex));
}
jsonSample = yearDataToJson(yearDataList);
}
@override
Widget build(BuildContext context) {
var json = jsonDecode(jsonSample);
return Scaffold(
body: Container(
padding: EdgeInsets.all(16.0),
child: toggle
? Column(
children: [
JsonTable(
json,
showColumnToggle: true,
tableHeaderBuilder: (String header) {
return Container(
padding: EdgeInsets.symmetric(
horizontal: 8.0, vertical: 4.0),
decoration: BoxDecoration(
border: Border.all(width: 0.5),
color: Colors.grey[300]),
child: Text(
header,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.display1.copyWith(
fontWeight: FontWeight.w700,
fontSize: 14.0,
color: Colors.black87),
),
);
},
tableCellBuilder: (value) {
return Container(
padding: EdgeInsets.symmetric(
horizontal: 4.0, vertical: 2.0),
decoration: BoxDecoration(
border: Border.all(
width: 0.5,
color: Colors.grey.withOpacity(0.5))),
child: Text(
value,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.display1.copyWith(
fontSize: 14.0, color: Colors.grey[900]),
),
);
},
allowRowHighlight: true,
rowHighlightColor: Colors.yellow[500].withOpacity(0.7),
paginationRowCount: 20,
),
SizedBox(
height: 20.0,
),
Text("Simple table which creates table direclty from json")
],
)
: Center(
child: Text(getPrettyJSONString(jsonSample)),
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.grid_on),
onPressed: () {
setState(
() {
toggle = !toggle;
},
);
}),
);
}
String getPrettyJSONString(jsonObject) {
JsonEncoder encoder = new JsonEncoder.withIndent(' ');
String jsonString = encoder.convert(json.decode(jsonObject));
return jsonString;
}
}
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SimpleTable(),
);
}
}
导入“包装:颤振/材料.省道”;
导入“dart:convert”;
导入“package:json_table/json_table.dart”;
导入“dart:convert”;
Payload payloadFromJson(String str)=>Payload.fromJson(json.decode(str));
字符串payloadToJson(有效负载数据)=>json.encode(data.toJson());
类有效载荷{
地图采集;
地图;地形抬升;
Map资本支出;
有效载荷({
这个收购,,
这个,这个,,
这是资本支出,
});
工厂负载.fromJson(映射json)=>负载(
acquisition:Map.from(json[“acquisition”])
.map((k,v)=>MapEntry(k,v.toDouble()),
bpuplation:Map.from(json[“BP uplation”])
.map((k,v)=>MapEntry(k,v.toDouble()),
资本支出:Map.from(json[“资本支出”])
.map((k,v)=>MapEntry(k,v.toDouble()),
);
映射到JSON()=>{
“采集”:地图来源(采集)
.map((k,v)=>MapEntry(k,v)),
“BP提升”:
Map.from(bpuplation).Map((k,v)=>MapEntry(k,v)),
“资本支出”:映射自(资本支出).Map((k,v)=>MapEntry(k,v)),
};
}
List yearDataFromJson(字符串str)=>
List.from(json.decode(str.map)(x)=>YearData.fromJson(x));
字符串yearDataToJson(列表数据)=>
encode(List.from(data.map((x)=>x.toJson());
类年数据{
弦年;
双重收购;
双重抬升;
双重资本支出;
年度数据({
今年,,
这个收购,,
这个,这个,,
这是资本支出,
});
factory YearData.fromJson(映射json)=>YearData(
年份:json[“年份”],
收购:json[“收购”],
bpuplation:json[“bpuplation”],
资本支出:json[“资本支出”],
);
映射到JSON()=>{
“年”:年,
“收购”:收购,
“BPUpgration”:BPUpgration,
“资本支出”:资本支出,
};
}
类SimpleTable扩展StatefulWidget{
@凌驾
_SimpleTableState createState()=>_SimpleTableState();
}
类_SimpleTableState扩展了状态{
字符串jsonString='''
{
“收购”:{
"2019": -78600000,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 77527013.89465855
},
“BP提升”:{
"2019": 0,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 0
},
“资本支出”:{
"2019": 0,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 0
}
}
''';
字符串jsonSample=“”;
布尔切换=真;
列表年份数据列表=[];
@凌驾
void initState(){
//TODO:实现initState
转移();
super.initState();
}
无效转让(){
有效载荷=payloadFromJson(jsonString);
罗列年度数据
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:json_table/json_table.dart';
import 'dart:convert';
Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));
String payloadToJson(Payload data) => json.encode(data.toJson());
class Payload {
Map<String, double> acquisition;
Map<String, double> bpUplift;
Map<String, double> capex;
Payload({
this.acquisition,
this.bpUplift,
this.capex,
});
factory Payload.fromJson(Map<String, dynamic> json) => Payload(
acquisition: Map.from(json["Acquisition"])
.map((k, v) => MapEntry<String, double>(k, v.toDouble())),
bpUplift: Map.from(json["BP Uplift"])
.map((k, v) => MapEntry<String, double>(k, v.toDouble())),
capex: Map.from(json["Capex"])
.map((k, v) => MapEntry<String, double>(k, v.toDouble())),
);
Map<String, dynamic> toJson() => {
"Acquisition": Map.from(acquisition)
.map((k, v) => MapEntry<String, dynamic>(k, v)),
"BP Uplift":
Map.from(bpUplift).map((k, v) => MapEntry<String, dynamic>(k, v)),
"Capex": Map.from(capex).map((k, v) => MapEntry<String, dynamic>(k, v)),
};
}
List<YearData> yearDataFromJson(String str) =>
List<YearData>.from(json.decode(str).map((x) => YearData.fromJson(x)));
String yearDataToJson(List<YearData> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class YearData {
String year;
double acquisition;
double bpUplift;
double capex;
YearData({
this.year,
this.acquisition,
this.bpUplift,
this.capex,
});
factory YearData.fromJson(Map<String, dynamic> json) => YearData(
year: json["year"],
acquisition: json["Acquisition"],
bpUplift: json["BPUplift"],
capex: json["Capex"],
);
Map<String, dynamic> toJson() => {
"year": year,
"Acquisition": acquisition,
"BPUplift": bpUplift,
"Capex": capex,
};
}
class SimpleTable extends StatefulWidget {
@override
_SimpleTableState createState() => _SimpleTableState();
}
class _SimpleTableState extends State<SimpleTable> {
String jsonString = '''
{
"Acquisition": {
"2019": -78600000,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 77527013.89465855
},
"BP Uplift": {
"2019": 0,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 0
},
"Capex": {
"2019": 0,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 0
}
}
''';
String jsonSample = "";
bool toggle = true;
List<YearData> yearDataList = [];
@override
void initState() {
// TODO: implement initState
transfer();
super.initState();
}
void transfer() {
Payload payload = payloadFromJson(jsonString);
List<YearData> yearDataList = [];
for (var val in payload.acquisition.keys) {
var year = val;
var acquisition = payload.acquisition[val];
var capex = payload.capex[val];
var bpUplift = payload.bpUplift[val];
yearDataList.add(YearData(
year: year,
acquisition: acquisition,
bpUplift: bpUplift,
capex: capex));
}
jsonSample = yearDataToJson(yearDataList);
}
@override
Widget build(BuildContext context) {
var json = jsonDecode(jsonSample);
return Scaffold(
body: Container(
padding: EdgeInsets.all(16.0),
child: toggle
? Column(
children: [
JsonTable(
json,
showColumnToggle: true,
tableHeaderBuilder: (String header) {
return Container(
padding: EdgeInsets.symmetric(
horizontal: 8.0, vertical: 4.0),
decoration: BoxDecoration(
border: Border.all(width: 0.5),
color: Colors.grey[300]),
child: Text(
header,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.display1.copyWith(
fontWeight: FontWeight.w700,
fontSize: 14.0,
color: Colors.black87),
),
);
},
tableCellBuilder: (value) {
return Container(
padding: EdgeInsets.symmetric(
horizontal: 4.0, vertical: 2.0),
decoration: BoxDecoration(
border: Border.all(
width: 0.5,
color: Colors.grey.withOpacity(0.5))),
child: Text(
value,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.display1.copyWith(
fontSize: 14.0, color: Colors.grey[900]),
),
);
},
allowRowHighlight: true,
rowHighlightColor: Colors.yellow[500].withOpacity(0.7),
paginationRowCount: 20,
),
SizedBox(
height: 20.0,
),
Text("Simple table which creates table direclty from json")
],
)
: Center(
child: Text(getPrettyJSONString(jsonSample)),
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.grid_on),
onPressed: () {
setState(
() {
toggle = !toggle;
},
);
}),
);
}
String getPrettyJSONString(jsonObject) {
JsonEncoder encoder = new JsonEncoder.withIndent(' ');
String jsonString = encoder.convert(json.decode(jsonObject));
return jsonString;
}
}
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SimpleTable(),
);
}
}