詳解Jackson 使用以及效能介紹
直接上程式碼,看下最簡單也是最常用的方法,將Object 轉為 JSON 以及將Json轉為Object方式
public class TestJackson { public static void main(String[] args) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); Map<String,Object> params = new HashMap<>(); params.put("name","jack"); params.put("age",18); //將物件轉為JSON串 String jsonString = objectMapper.writeValueAsString(params); System.out.println(jsonString); System.out.println("--------------------分割線-----------------------------"); //將JSON串 轉為 Object 物件 Map resultMap = objectMapper.readValue(jsonString,HashMap.class); resultMap.entrySet().stream().forEach(entry ->{ System.out.println(entry); }); } }
如果你只是忘了怎麼操作,或者只是想知道怎麼物件和JSON串如何相互轉,那麼你看到這就足夠了,如果你想了解更多關於Jackson,以及Jackson與fastJson等的對比,那麼可以往下看。
介紹
Jackson 是當前用的比較廣泛的,用來序列化和反序列化 json 的 Java 的開源框架。Jackson 社 區相對比較活躍,更新速度也比較快, 從 Github 中的統計來看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的預設 json 解析器便是 Jackson。 Jackson 優點很多。 Jackson 所依賴的 jar 包較少 ,簡單易用。與其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 檔案速度比較快;Jackson 執行時佔用記憶體比較低,效能比較好;Jackson 有靈活的 API,可以很容易進行擴充套件和定製。
Jackson 的 1.x 版本的包名是 org.codehaus.jackson ,當升級到 2.x 版本時,包名變為 com.fasterxml.jackson,本文討論的內容是基於最新的 Jackson 的 2.9.1 版本。
元件
- jackson-core,核心包,提供基於"流模式"解析的相關 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 內部實現正是通過高效能的流模式 API 的 JsonGenerator 和 JsonParser 來生成和解析 json。
- jackson-annotations,註解包,提供標準註解功能;
- jackson-databind ,資料繫結包, 提供基於"物件繫結" 解析的相關 API ( ObjectMapper ) 和"樹模型" 解析的相關 API (JsonNode);基於"物件繫結" 解析的 API 和"樹模型"解析的 API 依賴基於"流模式"解析的 API。
pom依賴
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.5</version> </dependency>
jackson-databind 依賴 jackson-core 和 jackson-annotations,當新增 jackson-databind 之後, jackson-core 和 jackson-annotations 也隨之新增到 Java 專案工程中。在新增相關依賴包之後,就可以使用 Jackson。
資訊配置
在呼叫 writeValue 或呼叫 readValue 方法之前,往往需要設定 ObjectMapper 的相關配置資訊。這些配置資訊應用 java 物件的所有屬性上
//在反序列化時忽略在 json 中存在但 Java 物件不存在的屬性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); //在序列化時日期格式預設為 yyyy-MM-dd'T'HH:mm:ss.SSSZ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); //在序列化時忽略值為 null 的屬性 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //忽略值為預設值的屬性 objectMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT);
更多配置資訊可以檢視 Jackson 的 DeserializationFeature,SerializationFeature 和 I nclude。
註解使用
Jack還提供了註解方式的使用
註解 | 用法 |
---|---|
@JsonProperty | 用於屬性,把屬性的名稱序列化時轉換為另外一個名稱。示例: @JsonProperty("birth_ d ate") private Date birthDate; |
@JsonFormat | 用於屬性或者方法,把屬性的格式序列化時轉換成指定的格式。示例: @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm") public Date getBirthDate() |
@JsonPropertyOrder | 用於類, 指定屬性在序列化時 json 中的順序 , 示例: @JsonPropertyOrder({ "birth_Date","name" }) public class Person |
@JsonCreator | 用於構造方法,和 @JsonProperty 配合使用,適用有引數的構造方法。 示例: @JsonCreator public Person(@JsonProperty("name")String name) {…} |
@JsonAnySetter | 用於屬性或者方法,設定未反序列化的屬性名和值作為鍵值儲存到 map 中 @JsonAnySetter public void set(String key,Object value) { map.put(key,value); } |
@JsonAnyGetter | 用於方法 ,獲取所有未序列化的屬性 public Map<String,Object> any() { return map; } |
public class TestJackson { public static void main(String[] args) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); //將物件轉為JSON串 String jsonString = objectMapper.writeValueAsString(new User()); System.out.println(jsonString); } } class User { @JsonProperty("name") private String aaa = "hello"; @JsonProperty("date") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date bbb = new Date(); ...省略setter 和 getter... }
讀取物件轉換 還可以從 Reader,File,URL,以及InputStream,位元組陣列中等 中獲取物件資料,喜歡的可以自己研究下
那麼效能如何呢?
對比物件選擇應用最廣泛的Jackson和Google出品的Gson。測試環境選擇JDK 8,AMD 3700X,3200MHZ記憶體。簡化實驗,只測試簡單物件和複雜物件的String轉物件、物件轉String,呼叫1千萬次的對比結果如下(時間單位是毫秒):
從測試結果看,FastJson確實是最快的,但僅比Jackson快20%左右,Google的Gson是最慢的,差距較大。讀到這裡,是不是覺得選擇FastJson肯定沒錯啊!但其實,FastJson在國際上並不是很流行,反而Jackson很流行,難道其他人傻?當然不是,因為Fastjson這兩年頻頻被曝出高危漏洞,這也是早已埋下的伏筆,因為FastJson為了追求快,捨棄了很多方面,比如失去了元貝應該相容的java特性,對json標準遵循也不嚴格,總體來說,fastjson是一個程式碼質量較差的國產類庫,當然它也在不斷的提升改變,也希望它繼續堅持。
如果面試官問為什麼選擇FastJson?因為快!這一個理由就可以把他頂回去了。
這裡的調查研究並不是很充分,沒有對記憶體佔用、大文件的測試。
在現代應用程式中,即使最慢的Gson,也是滿足需求的;解析文件速度的快慢,並不能作為選型的唯一標準,可能連主要標準都算不上。對IO優化,並行處理等優化措施,比選用一個更快的庫更有效。
所以整體上來說Jackson 綜合評價應該是很不錯的。
到此這篇關於詳解Jackson 使用以及效能介紹的文章就介紹到這了,更多相關Jackson 使用及效能內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!