默认大家都知道这个吧?
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.length
val maxLine = 400
var i = 0
while (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场景。还是很耗时的。