Gson打印按照想要的key顺序

文章介绍了如何使用Gson库在Java中将对象转换为美化且有序的JSON格式,通过自定义SortedJsonSerializer实现字段的指定顺序输出,适用于Debug场景但效率较低。
摘要由CSDN通过智能技术生成

默认大家都知道这个吧?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值