前言

自定义log时,往往需要我们把后台返回的json字符串格式化输出到控制台,方便我们调试。Android原生可以通过JSONObject等进行格式化,将字符串格式化。flutter中并没有那么便利的实现方式,因此需要我们手动转换。想直接看代码的可以直接点击 d_logger  github查看。这是本人编写的一个log日志管理,觉得对你有帮助的麻烦点个like,谢谢。

实现思路

在conver包下,dart为我们提供了json转换工具。可以利用这点,先把json字符串转换成相应的对象。由于json可能返回的是一个数组或对象,因此需要我们进行判断,获取正确的转换类型,再进行下一步转换操作。

if (json.startsWith("{")) { //is jsonObjectMap<String, dynamic> decode = JsonCodec().decode(json);//...convert json
} else if (json.startsWith("[")) { //is jsonArrayList decode = JsonCodec().decode(json);//...convert json
} 

由于转换对象的层级不确定,即map或list都可能相互嵌套。在此可以利用递归,对元素进行遍历输出。定义convert方法,传入待解析对象。判断传入的对象类型:Map、List、String、num、bool,以此对不同类型进行格式化。

解析Map或List时,需要返回考虑以下几种结果:

1.集合不是任何字段的结果 ;

2.集合为某个字段的结果,需要区分集合为空、不为空两种格式化。

请注意1和4处,集合不为任何字段内容时,首尾和内容都需要换行进行显示。而当集合为某个字段内容时(2和3),头部需要紧随字段内容,且当集合为空,则不需要重新换行,直接响应尾部。循环递归时,可根据传入对应的判断进行调控。

解析String时,需要把内容加上 "" 并返回内容。

解析num和bool时,直接返回当前内容即可。

需要注意,为了能够让结果清晰明了,不同层级之前都需要加上对应的空格。递归时传入当前递归深度,根据深度获取前置空格。

///获取缩进空白符
String getDeepSpace(int deep) {var tab = StringBuffer();for (int i = 0; i < deep; i++) {tab.write("\t");}return tab.toString();
}

按照以上思路,json格式化的最终代码如下:

/// [object]  解析的对象
/// [deep]  递归的深度,用来获取缩进的空白长度
/// [isObject] 用来区分当前map或list是不是来自某个字段,则不用显示缩进。单纯的map或list需要添加缩进
String _convert(dynamic object, int deep, {bool isObject = false}) {var buffer = StringBuffer();var nextDeep = deep + 1;if (object is Map) {var list = object.keys.toList();if (!isObject) {//如果map来自某个字段,则不需要显示缩进buffer.write("${getDeepSpace(deep)}");}buffer.write("{");if (list.isEmpty) {//当map为空,直接返回‘}’buffer.write("}");}else {buffer.write("\n");for (int i = 0; i < list.length; i++) {buffer.write("${getDeepSpace(nextDeep)}\"${list[i]}\":");buffer.write(_convert(object[list[i]], nextDeep, isObject: true));if (i < list.length - 1) {buffer.write(",");buffer.write("\n");}}buffer.write("\n");buffer.write("${getDeepSpace(deep)}}");}} else if (object is List) {if (!isObject) {//如果list来自某个字段,则不需要显示缩进buffer.write("${getDeepSpace(deep)}");}buffer.write("[");if (object.isEmpty) {//当list为空,直接返回‘]’buffer.write("]");}else {buffer.write("\n");for (int i = 0; i < object.length; i++) {buffer.write(_convert(object[i], nextDeep));if (i < object.length - 1) {buffer.write(",");buffer.write("\n");}}buffer.write("\n");buffer.write("${getDeepSpace(deep)}]");}} else if (object is String) {//为字符串时,需要添加双引号并返回当前内容buffer.write("\"$object\"");} else if (object is num || object is bool) {//为数字或者布尔值时,返回当前内容buffer.write(object);}  else {//如果对象为空,则返回null字符串buffer.write("null");}return buffer.toString();
}

如果有更好的实现方式欢迎留言讨论~

Flutter实现json格式化输出相关推荐

  1. c语言中json格式化输出,JSON格式化输出

    JSON格式化输出 今天有个需求是对输出的JSON进行格式化 首先想到的就是jsBeautifier之类的小插件 搜索了一番看到有一位朋友回答JSON.stringify可以输出格式化的JSON字符串 ...

  2. Python接口自动化响应结果json格式化输出+断言响应结果中指定的属性值+其他

    一.Python字典 二.Python元组 三.接口响应值转为字典格式 四.接口响应值以json格式输出并添加到allure报告中 五.断言响应结果中指定的属性值 六.TypeError: strin ...

  3. golang json 格式化输出对象

    Json 形式输出 Golang 如果想要按json字符串的形式输出某个对象,先使用 json.Marshal()函数把对象转换成[]byte数组,然后string(obj)强转成字符串后用%v输出, ...

  4. 用python3写一段代码提取pdf和ofd格式发票内容并json格式化输出

    使用Python 3写一段代码来提取PDF和OFD格式发票内容并以JSON格式输出,可以使用Python库PyPDF2和pyofd:import PyPDF2 import pyofd# 读取PDF文 ...

  5. Linux json格式化输出

    话不多说直接上干活,json报文转为标准的格式输出,如果是在文件里通过vim方法,见上一篇博客:https://blog.csdn.net/qingfengxd1/article/details/99 ...

  6. html中JSON格式化输出

    今天做一个API后台管理系统新增了日志模块,我是把操作的数据直接存入mongo数据库的,mongo是存入的json格式但是我想输出存入的操作详情到页面一直是很乱的格式,我想按照mongo的格式输出找了 ...

  7. Python 爬虫json格式化输出

    import requests import json # 构造请求头 headers={"Accept-Encoding": "identity",'sess ...

  8. 【Linux】Linux JSON 格式化输出

    1.使用jq命令 $ echo '{"uid":100120,"token":"1fa9fb8004b04f66b7da57393641eddc&qu ...

  9. 【Groovy】json 序列化 ( 类对象转为 json 字符串 | 使用 JsonBuilder 进行转换 | 使用 JsonOutput 进行转换 | 将 json 字符串格式化输出 )

    文章目录 一.Groovy 对象转为 json 字符串 ( 使用 JsonBuilder 进行转换 ) 二.使用 JsonOutput 将指定类型对象转为 json 字符串 三.将 json 字符串格 ...

最新文章

  1. 监控、链路追踪、日志这三者有何区别?
  2. 雨林木风Ghost Win7 SP1 装机版 YN2012.05
  3. php面向对象 设计模式,PHP面向对象单态设计模式详解
  4. 无线通信原理及协议栈(ZigBee、蓝牙等)解析
  5. mac 终端里进入mysql和退出
  6. malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理
  7. android listview中item倒计时,GitHub - TangAnna/ListViewTimer: 列表中每一个item都有计时器 (可实现倒计时或者计时器的功能)...
  8. u盘 轻量linux,3种方法来创建轻量、持久化的Xubuntu Linux USB系统盘
  9. CSS3 盒尺寸 box-sizing属性
  10. alphac测试和bata测试区别_绝缘电阻测试仪和接地电阻测试仪的测试方式区别
  11. STM32工作笔记0093---DAC数模转换实验-M3
  12. 2017java面试_2017 Java面试大全(一)
  13. 测试显卡风扇的软件,让噪音远离,显卡风扇转速调节
  14. Codepen 每日精选(2018-3-26)
  15. 管理类联考-英语: 前导( 三 )
  16. 博弈论:子博弈精炼均衡(子博弈都是纳什均衡,比纳什均衡更强的概念)
  17. python2.0下载_【Python for S60V2】Python for S60V2 V2.0官方免费下载_正式版下载-多特软件站...
  18. wlop一张多少钱_为什么很多人都对wlop有成见?
  19. 汉诺塔(图文结合),超好理解
  20. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

热门文章

  1. 使用电信光猫+华为路由器实现内网穿透,外网访问内网 之 路由器配置(华为路由WS5200 增强版)
  2. 我是如何拿到HTTPS中的加密数据(微信小程序同样适用)
  3. Forrester评出十佳移动体验品牌
  4. Freemarker模板的使用
  5. 机器学习(三)—— 线性回归
  6. PHP简单入门基础知识
  7. JLU第三次数据结构上机实验解题报告
  8. Python opencv3安装
  9. 字典(dict)作业
  10. 英语口语练习系列-C29-鸟类-辨别身份-断弦的琴