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.原代码已删除,这个版本是优化后的.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值