Gson打印按照想要的key顺序

ops/2024/9/23 14:22:37/

默认大家都知道这个吧?

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/ops/28538.html

相关文章

翻译插件Translation和AndroidLocalize

目录 前言一、Translation二、AndroidLocalize 前言 两个Android Studio的插件&#xff0c;一个是Translation&#xff0c;一个是AndroidLocalize&#xff0c;前者是自动化翻译插件&#xff0c;可以选中代码中的代码进行翻译&#xff0c;也可在线进行查询翻译&#xff1b;后者…

【Linux】线程的创建、回收分离以及线程的同步互斥

目录 一、多线程的基本编程 二、线程安全&#xff08;同步互斥&#xff09; 1.使用互斥锁达到互斥 2.使用互斥锁和条件变量达到线程间的同步互斥 一、多线程的基本编程 线程回收&#xff1a;线程在运行时需要分配内存空间、处理器时间等系统资源&#xff0c;这些资源在线程…

C++每日一练——两个数组的交集

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums…

【设计模式】16、state 状态模式

文章目录 十六、state 状态模式16.1 自动购物机16.1.1 vending_machine_test.go16.1.2 vending_maching.go16.1.3 state.go16.1.4 no_good_state.go16.1.5 has_good_state.go 16.2 player16.2.1 player_test.go16.2.2 player.go16.2.3 state.go16.2.4 stopped_state.go16.2.5 p…

VitePress 构建的博客如何部署到 github 平台?

VitePress 构建的博客如何部署到 github 平台&#xff1f; 1. 新建 github 项目 2. 构建 VitePress 项目 2.1. 设置 config 中的 base 由于我们的项目名称为 vite-press-demo&#xff0c;所以我们把 base 设置为 /vite-press-demo/&#xff0c;需注意前后 / export default…

云手机对出海企业有什么帮助?

近些年&#xff0c;越来越多的企业开始向海外拓展&#xff0c;意图发掘更广阔的市场。在这过程中&#xff0c;云手机作为一个新型工具为很多企业提供了助力&#xff0c;尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先&#xff0c;云手机的出现解决了企业在海外拓…

基于springboot实现企业级工位管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现企业级工位管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业级工位管理系统的开发全过程。通过分析企业级工位管理系统管理的不足&#xff0c;创建了一个计算机管理企业级工…

Java中的模版方法设计模式详解

Java中的模版方法设计模式详解 在Java编程中&#xff0c;设计模式是一种解决常见问题的最佳实践。其中&#xff0c;模版方法设计模式是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。这样可以使子类在不改变算法结构的情况…