Gson打印按照想要的key顺序

server/2024/11/10 12:30:41/

默认大家都知道这个吧?

val gson = GsonBuilder().setPrettyPrinting().create()
log(gson.toJson(bean))

它是用于将对象bean,转成json以后,能够比较漂亮的打印出json的结构。我常用的是如下4个函数。

//就是jsonStr,使用该函数来打印。把jsonStr转成Json的操作对象再行解析
private fun formatJsonBeautifulJsonStr(str:String) : String {return try {val jsonElement: JsonElement = JsonParser.parseString(str)val beautifulGson = GsonBuilder().setPrettyPrinting().create()return beautifulGson.toJson(jsonElement)} catch (e:Exception) {str}
}//数据bean类的打印
fun formatJsonBeautiful(obj:Any) : String {return try {val beautifulGson = GsonBuilder().setPrettyPrinting().create()return beautifulGson.toJson(obj)} catch (e:Exception) {""}
}//使用场景json结构打印。当json太大,分行打印。
//这个函数虽然简单,但是当json过大(500KB以上)的时候,打印会卡很久。如果一行内容过大也是打印不全的。
fun largeLogWithLine(tag:String, log:String) {val ss = log.split("\n")for (line in ss) Log.d(tag, line)
}//使用场景json结构打印。分行打印2.0。推荐。当然如果一行内容过大也是打印不全的。
fun logLargeLine(tag:String, str:String) {val len = str.lengthval maxLine = 400var i = 0while (i < len) {var lineIndex = str.indexOf("\n", i + maxLine)if (lineIndex == -1) {lineIndex = len}val log = str.substring(i, min(lineIndex, len))Log.d(tag, log)i = lineIndex + 1}
}

但是,由于json内部在序列化或者反序列化的过程,key其实是hashMap,无序的。因此,得不到我们想要的打印。

那么, 就可以如下处理:

class OutBean {public InBean bean;
}class InBean {public String name;public int age;public List<String> skills;
}class CutomBeatyPrintGson<T> {fun standardizeFormat(json: OutBean?): String {val gson = GsonBuilder().setPrettyPrinting().registerTypeAdapter(InBean::class.java, SortedJsonSerializer()).create()return gson.toJson(json)}private class SortedJsonSerializer<InBean> : JsonSerializer<InBean> {override fun serialize(foo: InBean, type: Type, context: JsonSerializationContext): JsonElement {val jo = JsonObject()jo.add("name", context.serialize(foo.name))jo.add("age", context.serialize(foo.age))jo.add("skills", context.serialize(foo.skills))return jo}}
}

通过注册解析函数,自行构建得到顺序。

当然如上一些代码,尽量使用在Debug场景。还是很耗时的。


http://www.ppmy.cn/server/27703.html

相关文章

Android 在AMS中拦截某个指定Activity的启动

文章目录 Android在AMS中拦截某个具体Activity的启动方案一&#xff08;推荐&#xff09;&#xff1a;在ActivityTaskManagerService.startActivityAsUser方法中去作拦截方案二&#xff1a;在Dialog.show()方法中直接对这个包名所创建的Dialog做限制 Android在AMS中拦截某个具体…

python 注释符

4、注释 1、单行注释 单行注释用于解释代码中的一行或一小段代码。 在Python中&#xff0c;单行注释以#开头&#xff0c;后面的内容都是注释。 单行注释可以放在代码的任何位置&#xff0c;但通常放在代码行的上方或旁边。 单行注释不会影响代码的执行&#xff0c;Python解…

C++中的右值引用和移动语义

1 左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 什么是左值&#xff1f;什么是左值引用&#xff1f; 左…

内网端口转发与代理

思路&#xff1a;渗透的前提是双方能够建立通信。目前无法和win7建立通信&#xff0c;但是拿到了windows2003的权限&#xff0c;所以可以在Windows2003主机上面建立节点&#xff0c;作为跳板机去访问到内网。 目前状态&#xff1a;控制win2003&#xff08;IP&#xff1a;192.1…

上位机图像处理和嵌入式模块部署(树莓派4b利用驱动实现进程数据共享)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们讨论过&#xff0c;目前在linux系统上面有很多办法可以实现多进程数据共享。这里面比如说管道&#xff0c;比如说共享内存&#xff0c;比如…

react 笔记

vscode bookmarks react源码 v18.2.0 jsx语法转换成reactelement reactapi npx creatte-react-app 项目名称&#xff08;myreactapp&#xff09; cd 项目名称&#xff08;myreactapp&#xff09; npm start启动项目 看index.js文件 React ReactDom App 看App.js文件 react有…

【Unity动画系统】详解Root Motion动画在Unity中的应用(二)

Root Motion遇到Blend Tree 如果Root Motion动画片段的速度是1.8&#xff0c;那么阈值就要设置为1.8&#xff0c;那么在代码中的参数就可以直接反映出Root Motion的最终移动速度。 Compute Thresholds&#xff1a;根据Root Motion中某些数值自动计算这里的阈值。 Velocity X/…

MATLAB - 机器人动力学 - 质心(Center of Mass)

系列文章目录 前言 一、用法 com centerOfMass(robot) com centerOfMass(robot,configuration) [com,comJac] centerOfMass(robot,configuration) 二、说明 com centerOfMass(robot) 计算机器人模型在原点构型处相对于基础坐标系的质心位置。com centerOfMass(robot,conf…