默认大家都知道这个吧?
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场景。还是很耗时的。