Fastjson是一個高效的JSON解析器,可以解析各種JSON格式的數據。但是,有時候我們會遇到帶有特殊分隔符的JSON格式數據,如何解析呢?下面是一個例子。
{ "name": "張三", "score": { "數學": "90分|優(yōu)秀", "語文": "85分|良好" } }
上面的JSON數據中,數學和語文的成績都是用豎線”|”分隔的。如果我們直接使用Fastjson解析這個數據,會發(fā)現得到的成績數據并不是我們期望的JSON格式。
{ "數學": "90分|優(yōu)秀", "語文": "85分|良好" }
解決這個問題的方法很簡單,只需重寫JSONReader類中的readObject方法。
public class MyJSONReader extends JSONReader { @Override protected Object readObject(JSONLexer lexer, Type type, Object fieldName, Object object) { // 判斷是否是score字段 if (fieldName.equals("score")) { MapscoreMap = new HashMap<>(); // 解析score字段的值 lexer.nextToken(); // 左大括號 while (lexer.token() != JSONToken.RBRACE) { // 右大括號 String key = lexer.stringVal(); // 成績項名稱 lexer.nextToken(); String value = lexer.stringVal(); // 成績和等級 String[] scoreAndLevel = value.split("\\|"); // 使用正則表達式分隔成績和等級 scoreMap.put(key, scoreAndLevel[0]); // 只保存成績,不保存等級 lexer.nextToken(); } return scoreMap; } else { return super.readObject(lexer, type, fieldName, object); } } }
在重寫的readObject方法中,我們首先判斷當前解析的字段是否是”score”,如果是則進入自己的解析邏輯。我們可以使用Java自帶的正則表達式功能,根據豎線”|”分隔成績和等級,并只保存成績。
使用重寫后的MyJSONReader類,我們可以完成對帶有特殊分隔符JSON數據的解析。
public class Demo { public static void main(String[] args) { String jsonStr = "{\n" + " \"name\": \"張三\",\n" + " \"score\": {\n" + " \"數學\": \"90分|優(yōu)秀\",\n" + " \"語文\": \"85分|良好\"\n" + " }\n" + "}"; MyJSONReader reader = new MyJSONReader(); MapscoreMap = reader.readObject(jsonStr, Map.class); System.out.println(scoreMap.get("數學")); // 輸出90分 } }
以上就是使用Fastjson解析帶有特殊分隔符JSON數據的方法,希望能對您有所幫助。