Flutter中的json转对象
网上有好多json转对象的方法:
在线生成的:https://javiercbk.github.io/json_to_dart/
弊端:每次都要打开网页去生成,尤其是公司网不好的时候,急死;
插件生成的:插件名:FlutterJsonBeanFactory
弊端:不知道没弄明白还是根本没法设置,我只想要一个简单的文件,不要什么继承.
因为子类型总是重复生成.
以下我自己解析json内容生成对象[优化后]
只涉及到自己用到的类型,如有其他,读者可随时更改
import 'dart:convert';
import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
void main() {
test('生成实体数据', () async {
Future<void> write(String fileName, String content) async {
File indexFile = File(fileName);
if (!await indexFile.exists()) {
indexFile.createSync();
} else {
print("重写:$indexFile");
}
IOSink out = indexFile.openWrite();
out.write(content);
}
String jsonFile = "models.json"; // json文件
String jsonData = await File(jsonFile).readAsString();
Map<String, dynamic> entities = convert.json.decode(jsonData);
String filePath = entities.remove('path') ?? "lib/model"; // 生成目录,不带/后缀
String libraryName = entities.remove('library') ?? "xgcs_model"; // 模块名称
String entitySuffix = entities.remove('suffix') ?? "Entity"; // 实体后缀
File libraryFile = File("$filePath/index.dart");
await libraryFile.parent.create();
Map<String, String> keyClassNameMap = {};
for (String fileName in entities.keys) {
Map<String, dynamic> data = entities[fileName];
String className = fileName.substring(0, 1).toUpperCase() + fileName.substring(1) + entitySuffix;
keyClassNameMap[fileName] = className;
// 字段名
List<String> fieldNames = [];
// 字段对应索引类型名:String,int,type等
Map<String, String> typeNames = {};
// 泛型类型
Map<String, String> itemTypeNames = {};
for (var fieldName in data.keys) {
var fieldValue = data[fieldName];
var fieldType = fieldValue.runtimeType.toString();
if (fieldValue is String) {
if (keyClassNameMap.containsKey(fieldValue)) {
// 引用已定义类型
fieldType = keyClassNameMap[fieldValue]!;
}
} else if (fieldValue is List) {
// 泛型类型
var itemType = fieldValue[0];
if (itemType is String && keyClassNameMap.containsKey(itemType)) {
// 泛型集合
itemType = keyClassNameMap[itemType];
itemTypeNames[fieldName] = itemType;
} else {
itemType = itemType.runtimeType.toString();
}
fieldType = 'List<$itemType>';
} else if (fieldValue is Map) {
var mapKeyType = fieldValue.keys.first.runtimeType.toString();
var mapValueType = fieldValue.values.first.runtimeType.toString();
fieldType = 'Map<$mapKeyType,$mapValueType>';
}
fieldNames.add(fieldName);
typeNames[fieldName] = fieldType;
}
String attributesContent = fieldNames.map((field) => "${typeNames[field]}? $field").join(";\n ");
String constructorContent = fieldNames.map((field) => 'this.$field').join(",\n ");
String copyWithContent = fieldNames.map((field) => "${typeNames[field]}? $field").join(",\n ");
String copyWithContentContent = fieldNames.map((field) => "$field: $field ?? this.$field").join(",\n ");
String forJsonContent = fieldNames.map((field) {
var typeName = typeNames[field];
if (typeName!.startsWith("List") && itemTypeNames.containsKey(field)) {
var itemType = itemTypeNames[field];
return "$field = ((json['$field'] ?? []) as List).map((_) => $itemType.forJson(_)).toList()";
}
if (keyClassNameMap.containsKey(field)) {
return "$field = $typeName.forJson(json['$field'])";
}
return "$field = json['$field']";
}).join(";\n ");
String toJsonContent = fieldNames.map((field) {
var typeName = typeNames[field];
if (typeName!.startsWith("List") && itemTypeNames.containsKey(field)) {
return "data['$field'] = ($field ?? []).map((_) => _.toJson()).toList()";
}
if (keyClassNameMap.containsKey(field)) {
return "data['$field'] = $field?.toJson()";
}
return "data['$field'] = $field";
}).join(";\n ");
// class内容
String classContent = """
part of $libraryName;
class $className {
$attributesContent;
$className({
$constructorContent,
});
$className copyWith({
$copyWithContent,
}) {
return $className(
$copyWithContentContent,
);
}
$className.forJson(Map<String, dynamic> json) {
$forJsonContent;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = {};
$toJsonContent;
return data;
}
}
""";
await write("$filePath/$fileName.dart", classContent);
}
await write("$filePath/index.dart", "library $libraryName;\n\n${entities.keys.map((_) => 'part \'$_.dart\'').join(';\n\n')};\n\npart 'extension.dart';");
});
}
json格式如下[属性名不要与文件名冲突,bug为解决]
{
"library": "xgcs_model",
"path": "lib/model",
"suffix": "Entity",
"user": {
"id": "用户id-uuid",
"username": "登录名一般为手机号",
"nickname": "昵称",
"phone": "绑定的手机号",
"birthday": 1234567,
"weiXinId": "绑定微信",
"aliPayId": "绑定支付宝",
"guide": false,
"settings": {
"String": "dynamic"
}
}
}
备注说明
1.原代码已删除,这个版本是优化后的.