fastjson 定製化解析

2021-07-10 19:09:08 字數 2473 閱讀 4111

最近寫了乙個簡單的定製解析。

fastjson 解析 map key value時有bug.

public static class kvpair

public kvpair(k key, v value)

public k getkey()

public void setkey(k key)

public v getvalue()

public void setvalue(v value)

}

這是乙個簡單的 keyvalue 類。這個類被fastjson解析出來的結果是:

public static void main(string args)

輸出結果為:

在fastjson 1.1.23 版本時, 只要改動一下 setvalue() 這個方法,就可以得到這樣的解析結果:

改動後的 setvalue(v value) 方法為:

public v setvalue(v value)

輸出結果為:

這明顯是 fastjson的bug。所以在1.1.46版本,已經不存在這個問題了。不管如何變化 setvalue()函式,最後的輸出結果仍然為:

輸出結果:

現在問題來了。我更希望解析為下面的這種。

這樣占用的資源更少,並且也很清楚的表達了意思。這怎麼寫?fastjson提供的specialconfig 來提供特殊的序列化配置。

首先我們先對這個class建立乙個特殊的序列化方法:

public static final serializeconfig json_write_config = new serializeconfig();

static

然後我們來構造這個特殊的序列化類:

public class kvpairserailzer implements objectserializer

kvpair pair = (kvpair)object;

out.write("");

}public void write(serializewriter out, object value) else if (value instanceof integer) else if (value instanceof long) else if (value instanceof string) else if (value instanceof double) else if (value instanceof float) else

}}

fastjson的邏輯是: 開始要傳入乙個序列化配置。這個序列化配置中有針對各個類如何進行序列化的子類(也就是對映關係)。如果我們將json_write_config傳入到序列化過程中,那麼針對 kvpair.class這個類,就可以使用kvpairserialzer()進行序列化。kvpairserialzer在這個類需要繼承objectserializer, 重要的是重構這個方法:

public void write(jsonserializer serializer, object object, object fieldname, type fieldtype)

這裡只要獲取

serializer.getwriter(),然後將序列化後的字串寫入到writer中就結束了。serializerwriter 其實就是乙個可變長char陣列,細節沒有什麼好講的。

另外 1.1.46 之前的版本如果不希望將某些field不放在序列化後的json中,需要加入乙個 實現了propertyprefilter的類才行。例如下面這個類:

public class fieldjsonignorefilter implements propertyprefilter  

return true;

}public fieldjsonignorefilter()

public void add(string excludefieldname)

public static final fieldjsonignorefilter field_json_ignore_filter = new fieldjsonignorefilter();

static

}

1.1.46版本之後只需要在在field上面加入annotation.就可以實現上面的效果。 

@jsonfield(serialize=false)

private string aaa;

fastjson解析json資料

fastjson為阿里巴巴推出來的對於解析的字段首字母是大寫的,容易出問題 import j a.util.arraylist import j a.util.list import com.alibaba.fastjson.json public class json fastjson stude...

TIDBSQL優化解析

兩處標紅的需要注意下 如果去除第乙個紅框框裡面的語句 desc sql語句可以發現執行過程發生改變 可以發現 t3,t4兩張表的userid關聯沒有走索引。tidb inlj t3,t4 上面這句其實是 tidb index lookup join 演算法 詳情 如果去除第二個紅框框裡面的語句 de...

使用FastJson解析JSON資料

spring boot預設的json使用起來比較不習慣,所以很自然我就想我能不能使用fastjson進行json解析呢?引入fastjson依賴庫 com.alibaba fastjson 1.2.15 這裡要說下很重要的話,官方文件說的1.2.10以後,會有兩個方法支援httpmessagecon...