Jackson最適化使用例

3822 ワード

JSONの3つの処理方法Jacksonは、3つのオプションのJSON処理方法(1つの方法とその2つの変形)を提供します.
ストリーミングAPI:(「インクリメンタル分析/生成」とも呼ばれる)JSONコンテンツを個別イベントとして読み取りおよび書き込みます.
org.codehaus.jackson.JsonParser読み、org.codehaus.jackson.JsonGeneratorが書きます.
StAX APIの励振.

ツリーモデル:JSONドキュメントの可変メモリツリーの表示形式を提供します.
org.codehaus.jackson.map.ObjectMapper生成ツリー;ツリーはJsonNodeノードセットを構成します.
ツリーモデルはXML DOMに似ています.

データバインディング:JSONとPOJOは互いに変換し、属性アクセサの規則または注釈に基づいている.
2つのバリエーションがあります.単純で完全なデータバインド:単純データバインド:Java Map、List、String、Numbers、BooleanおよびNull値からを変換する
完全なデータバインディング:任意のJava beanタイプ(および前述の「単純」タイプ)からを変換する
org.codehaus.jackson.map.ObjectMapperは2つの変種に対して,グループ化(marshalling)処理(JSON書き込み)と逆グループ化(unmarshalling,JSON読み)を行う.
JAXB励起下の注釈に基づく(コード優先)変種.

使用の観点から、これら3つの方法の使い方をまとめると以下のようになります.
ストリーミングAPI:パフォーマンスが最適な方法(最小オーバーヘッド、最も高速な読み取り/書き込み、その他の2つはそれに基づいて実現されます).
データバインド:最も便利な方法を使用します.
ツリーモデル:最も柔軟な方法.
 
ええ、すべてのコードを直接貼ってください.言うべきことはすべてコードの中にあります.
package com.wujintao.json;

import java.io.IOException;
import java.util.Date;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectReader;
import org.codehaus.jackson.map.ObjectWriter;
import org.junit.Test;

/**
 * http://wiki.fasterxml.com/JacksonDownload
 * http://wiki.fasterxml.com/JacksonInFiveMinutes
 * http://wiki.fasterxml.com/JacksonBestPracticesPerformance
 * http://jackson.codehaus.org/1.8.8/javadoc/index.html
 * http://wiki.fasterxml.com/ObjectReader
 * https://github.com/FasterXML/jackson-docs/wiki/ObjectWriter
 * jars:jackson-core-lgpl-1.8.10.jar,jackson-mapper-lgpl-1.8.10.jar
 * 
 * 1.    ,          ,Jackson > Gson > Json-lib。Jackson         Json-lib 10   
 * 2.JSON-lib        ,         JDK15, Jackson        
 * 3.      jackson      ,      ,json-lib       
 * 
 */
public class TestCase {
	
	@Test
	public void test() throws JsonGenerationException, JsonMappingException,
			IOException {
		long start = new Date().getTime();
		ObjectMapper mm = new ObjectMapper(); // can reuse, share
		Person pp = new Person();
		pp.setAdd("beijing");
		pp.setAge(11);
		pp.setSalary(1.1);
		pp.setSex(' ');
		String jj = mm.writeValueAsString(pp);
		System.out.println(jj);

		Person pp2 = mm.readValue(jj, Person.class);
		System.out.println(pp2);
		
		long end = new Date().getTime();
		System.out.println("using ObjectMapper cost:"+(end-start)+"ms");

		System.out.println("=================================");
		// 7. Prefer ObjectReader/ObjectWriter over ObjectMapper
		// Although the main reason to prefer these objects is thread-safety
		// (and thus correctness),there may be performance benefits as well

		// 8.When reading a root-level sequence of POJOs,
		// readValues() method of ObjectReader can be much more efficient
		// than doing explicit iteration using ObjectMapper.readValue() method.

		long start2 = new Date().getTime();
		ObjectMapper mapper = new ObjectMapper();
		Person person = new Person();
		person.setAdd("beijing");
		person.setAge(11);
		person.setSalary(1.1);
		person.setSex(' ');

		ObjectWriter writer = mapper.viewWriter(Person.class);
		String json = writer.writeValueAsString(person);
		System.out.println(json);
		// we'll be reading instances of MyBean
		ObjectReader reader = mapper.reader(Person.class);
		// and then do other configuration, if any, and read:
		Person result = reader.readValue(json);
		System.out.println(result);
		long end2 = new Date().getTime();
		System.out.println("using ObjectReader/ObjectWriter cost:"+(end2-start2)+"ms");
		
		//      ObjectReader/ObjectWriter
	}
	
	//  fast-json、Genson      
}