使用Jackson在Java中處理JSON
一、入門
Jackson中有個ObjectMapper類很是實用,用於Java物件與JSON的互換。
1、Java物件轉換為JSON:
User user=new User(); //Java Object
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(user); //返回字串
//輸出格式化後的字串(有效能損耗)
mapper.defaultPrettyPrintingWriter().writeValueAsString(user);
mapper.writeValue(new File("c:\\user.json"), user); //指定檔案寫入
//設定序列化配置(全域性),設定序列化時不輸出空值.
sharedMapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
2、JSON反序列化為Java物件:
ObjectMapper mapper = new ObjectMapper();
//解析器支援解析單引號
mapper.configure(Feature.ALLOW_SINGLE_QUOTES,true);
//解析器支援解析結束符
mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true);
HashMap jsonMap = mapper.readValue(json,HashMap.class); //轉換為HashMap物件
二、Jackson支援3種使用方式:
1、Data Binding:最方便使用.
(1)Full Data Binding:
- private static final String MODEL_BINDING = "{\"name\":\"name1\",\"type\":1}";
- public void fullDataBinding() throws Exception{
- ObjectMapper mapper = new ObjectMapper();
- Model user = mapper.readValue(MODEL_BINDING, Model.class);//readValue到一個實體類中.
- System.out.println(user.getName());
- System.out.println(user.getType());
- }
Model類:
- private static class Model{
- private String name;
- private int type;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getType() {
- return type;
- }
- public void setType(int type) {
- this.type = type;
- }
- }
(2)Raw Data Binding:
- /**
- Concrete Java types that Jackson will use for simple data binding are:
- JSON Type Java Type
- object LinkedHashMap<String,Object>
- array ArrayList<Object>
- string String
- number(no fraction) Integer, Long or BigInteger (smallest applicable)
- number(fraction) Double(configurable to use BigDecimal)
- true|false Boolean
- null null
- */
- public void rawDataBinding() throws Exception{
- ObjectMapper mapper = new ObjectMapper();
- HashMap map = mapper.readValue(MODEL_BINDING,HashMap.class);//readValue到一個原始資料型別.
- System.out.println(map.get("name"));
- System.out.println(map.get("type"));
- }
(3)generic Data Binding:
- private static final String GENERIC_BINDING = "{\"key1\":{\"name\":\"name2\",\"type\":2},\"key2\":{\"name\":\"name3\",\"type\":3}}";
- public void genericDataBinding() throws Exception{
- ObjectMapper mapper = new ObjectMapper();
- HashMap<String,Model> modelMap = mapper.readValue(GENERIC_BINDING,new TypeReference<HashMap<String,Model>>(){});//readValue到一個範型資料中.
- Model model = modelMap.get("key2");
- System.out.println(model.getName());
- System.out.println(model.getType());
- }
2、Tree Model:最靈活。
- private static final String TREE_MODEL_BINDING = "{\"treekey1\":\"treevalue1\",\"treekey2\":\"treevalue2\",\"children\":[{\"childkey1\":\"childkey1\"}]}";
- public void treeModelBinding() throws Exception{
- ObjectMapper mapper = new ObjectMapper();
- JsonNode rootNode = mapper.readTree(TREE_MODEL_BINDING);
- //path與get作用相同,但是當找不到該節點的時候,返回missing node而不是Null.
- String treekey2value = rootNode.path("treekey2").getTextValue();//
- System.out.println("treekey2value:" + treekey2value);
- JsonNode childrenNode = rootNode.path("children");
- String childkey1Value = childrenNode.get(0).path("childkey1").getTextValue();
- System.out.println("childkey1Value:"+childkey1Value);
- //建立根節點
- ObjectNode root = mapper.createObjectNode();
- //建立子節點1
- ObjectNode node1 = mapper.createObjectNode();
- node1.put("nodekey1",1);
- node1.put("nodekey2",2);
- //繫結子節點1
- root.put("child",node1);
- //陣列節點
- ArrayNode arrayNode = mapper.createArrayNode();
- arrayNode.add(node1);
- arrayNode.add(1);
- //繫結陣列節點
- root.put("arraynode", arrayNode);
- //JSON讀到樹節點
- JsonNode valueToTreeNode = mapper.valueToTree(TREE_MODEL_BINDING);
- //繫結JSON節點
- root.put("valuetotreenode",valueToTreeNode);
- //JSON繫結到JSON節點物件
- JsonNode bindJsonNode = mapper.readValue(GENERIC_BINDING, JsonNode.class);//繫結JSON到JSON節點物件.
- //繫結JSON節點
- root.put("bindJsonNode",bindJsonNode);
- System.out.println(mapper.writeValueAsString(root));
- }
3、Streaming API:最佳效能。
見官方文件例子。
參考資料:
1、http://wiki.fasterxml.com/JacksonInFiveMinutes Jackson官方教程示例
2、http://wiki.fasterxml.com/JacksonJavaDocs Jackson線上API文件
3、http://hjg1988.iteye.com/blog/561368 JSON工具效能比較:json-lib和jackson進行Java物件到json字串序列化。
相關文章
- 使用Java預處理實現JSON插入PostgreSQLJavaJSONSQL
- java 如何簡單快速處理 json 中的資料JavaJSON
- 7. Jackson用樹模型處理JSON是必備技能,不信你看模型JSON
- jackson時間格式的處理
- 使用Java處理JSON結構化資料 -Advanced Web MachineryJavaJSONWebMac
- 「譯」使用 System.Net.Http.Json 高效處理JsonHTTPJSON
- Java基礎-處理json字串解析案例JavaJSON字串
- Json工具類----JacksonJSON
- URL及日期等特殊資料格式處理-JSON框架Jackson精解第2篇JSON框架
- Python處理JSONPythonJSON
- JSON在Python中的使用JSONPython
- JSON簡介(java中的json庫使用)JSONJava
- 在Springboot + Mybaitis-plus 專案中利用Jackson實現json對java多型的(反)序列化Spring BootAIJSONJava多型
- java 請求HTTP返回json集合,物件處理方式JavaHTTPJSON物件
- Java 11:在Java中處理HTTP和WebSocket的新方法!JavaHTTPWeb
- C#中處理JSON資料的方式C#JSON
- Spring Security OAuth2 快取使用jackson序列化的處理SpringOAuth快取
- java中json的使用方法JavaJSON
- flutter json資料處理FlutterJSON
- Hive處理Json資料HiveJSON
- PostgreSQL處理JSON入門SQLJSON
- flutter demo (三):json處理FlutterJSON
- golang json處理問題GolangJSON
- Java XML和JSON:Java SE的文件處理,第1部分JavaXMLJSON
- Java XML和JSON:Java SE的文件處理 第2部分JavaXMLJSON
- SpringBoot中,使用 fastjson代替jacksonSpring BootASTJSON
- java當中的批處理Java
- Java 中的並行處理Java並行
- 處理json格式的資料JSON
- 二、淺談 JSON 處理技巧JSON
- spark處理json資料DemoSparkJSON
- C#處理json實戰C#JSON
- Calendar類在Java中的應用與日期時間處理Java
- 在Linux中,如何使用awk和sed進行文字處理?Linux
- Java 異常處理:使用和思考Java
- JSON解析器之Gson、FastJson、JacksonJSONAST
- JSON資料處理框架Jackson精解第一篇-序列化與反序列化核心用法JSON框架
- Java中對時間的處理Java
- java中的垃圾處理機制Java