Gson打印按照想要的key顺序

发布于:2024-05-02 ⋅ 阅读:(185) ⋅ 点赞:(0)

默认大家都知道这个吧?

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场景。还是很耗时的。


网站公告

今日签到

点亮在社区的每一天
去签到