json、javaBeanが互いに変換するツール--json-lib

14054 ワード

JSONに接触してから2年も経っていないが、最初にJSONに接触したのは軽量級のデータ交換フォーマットであることしか知らなかった.JavaScriptのサブセットに基づいています.その後はあまり使われなくなり、Easyuiを使い始め、Jsonと付き合わざるを得なくなった.しかし、Jsonに関する知識も整理されていない.最近まで、プロジェクトをしていて、フロントの要求が特に高く、easyuiが提供した方法だけでは需要を満たすことができなかったので、jquery、jsonに対して、もう一度よく使いました.今回は私に大きな収穫をもたらした.次にjavaでjsonを解析するツールについてお話しします.
今私は主に3種類あることを知っています:json-lib、jackson、fastjson.その中でjson-libは比較的早いです.今回のプロジェクトでもjson-libを使用していますが、まずjson-libの使用についてお話しします.
具体的なjson-libに関する知識はもちろん、簡単に言えばjson-libは何ができるのか、Json-libはJavaオブジェクトをjson形式の文字列に変換したり、Javaオブジェクトをxml形式のドキュメントに変換したりすることができ、同じようにjson文字列をJavaオブジェクトに変換したり、xml文字列をJavaオブジェクトに変換したりすることができます.
ここでは主にjsonの2つのクラスを用いた:jsonObjecとjsonArray.
JSOnObjectはJavaオブジェクトをjsonに変換するObject形式であり、JSOnArrayはJavaオブジェクトをjsonに変換するArray形式である.
では、jsonのObject形式、Array形式とは何ですか.
わかりやすい方法で、いわゆるjsonのObject形式は、JavaMapのようなキー値のペアのようなカッコの中に格納されています.例えば、{name:'hoojo’,age:24};
ではjsonのArray形式は?
中括弧、括弧の配列です.例えば:[‘json’,true,22];
一、使用前提
まずjson-libツールパッケージを公式にダウンロードします
ダウンロード先:http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/
現在最新のバージョンは2.4で、この例ではv 2を使用しています.3;json-libには、次の依存パッケージが必要です.
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6      
公式サイト:http://json-lib.sourceforge.net/
これらのJarをweb-infoの下のlibにコピーします.
二、javaBean
<span style="font-family:KaiTi_GB2312;font-size:18px;">@Entity
@Table(name = "job_content_detail")
public class JobContentDetail implements BaseEntity {
    <span style="white-space:pre">	</span>@Id
	@GeneratedValue(generator = "uuid")
	@GenericGenerator(name = "uuid", strategy = "uuid.hex")
	@Column(name = "ID", length = 32, nullable = false)
	private String id;

	@Column(name = "TS", length = 20, nullable = true)
	private String ts;

	@Column(name = "DR", length = 10, nullable = true)
	private Integer dr;

	@Column(name = "JOBCONTENTMAINID", length = 32, nullable = true)
	private String jobcontentmainid;

	@Column(name = "PRODUCTID", length = 32, nullable = true)
	private String productid;

	@Column(name = "PRODUCTUSAGE", length = 22, precision = 10, nullable = true)
	private String productusage;

	@Column(name = "ITEMQTY", length = 22, precision = 10, nullable = true)
	private Double itemqty;

	@Column(name = "BUILDERQTY", length = 22, precision = 10, nullable = true)
	private Double builderqty;

	@Column(name = "LABOURUNITID", length = 22, precision = 10, nullable = true)
	private String labourunitid;

	@Column(name = "LABOURFACTOR", length = 22, precision = 10, nullable = true)
	private Double labourfactor;
	
	@Column(name = "LABOURFACTOR2", length = 22, precision = 10, nullable = true)
	private Double labourfactor2;
	
	@Column(name = "LABOURFACTOR3", length = 22, precision = 10, nullable = true)
	private Double labourfactor3;

	@Column(name = "ManHours", length = 22, precision = 10, nullable = true)
	private Double manhours;

	@Column(name = "LabourRate", length = 22, precision = 10, nullable = true)
	private Double labourrate;

	@Column(name = "Total", length = 22, precision = 10, nullable = true)
	private Double total;

	@Column(name = "MATERIALUNITID", length = 32, nullable = true)
	private String materialunitid;

	@Column(name = "WASTEFACTOR", length = 22, precision = 10, nullable = true)
	private Double wastefactor;

	@Column(name = "MATERIALTOTAL", length = 22, precision = 10, nullable = true)
	private Double materialtotal;

	@Column(name = "MARERIALRATE", length = 22, precision = 10, nullable = true)
	private Double marerialrate;

	@Column(name = "MANUALLYKEYED", length = 2, nullable = true)
	private String manuallykeyed;

	@Column(name = "PRODUCTRATE", length = 22, precision = 10, nullable = true)
	private Double productrate;

	@Column(name = "PRODUCTMANUALENTRY", length = 150, nullable = true)
	private String productmanualentry;

	@Column(name = "LevelOfDifficulty", length = 22, precision = 10, nullable = true)
	private Double levelofdifficulty;

	@Column(name = "MATERIALQTY", length = 22, precision = 10, nullable = true)
	private Double materialqty;

	@Column(name = "MATERIALBUILDERQTY", length = 22, precision = 10, nullable = true)
	private Double materialbuilderqty;

	@Column(name = "MERCHANT1PRICE", length = 22, precision = 10, nullable = true)
	private Double merchant1price;

	@Column(name = "MERCHANT2PRICE", length = 22, precision = 10, nullable = true)
	private Double merchant2price;

	@Column(name = "MERCHANT3PRICE", length = 22, precision = 10, nullable = true)
	private Double merchant3price;

	@Column(name = "MERCHANT4PRICE", length = 22, precision = 10, nullable = true)
	private Double merchant4price;

	@Column(name = "MATERIALADJUSTMENT", length = 22, precision = 10, nullable = true)
	private Double materialadjustment;

	@Column(name = "SubContractorLabour", length = 2, nullable = true)
	private String subcontractorlabour;

	@Column(name = "SubContractorMaterial", length = 2, nullable = true)
	private String subcontractormaterial;
	
	@Column(name = "ProductName", length = 1000, nullable = true)
	private String productname;

	@Column(name="productcode",length=10,nullable=true)
	 private String productcode;
    <span style="white-space:pre">	</span>//  ge,set   ,
}</span>

三、JSONオブジェクト逆シーケンス化javaオブジェクト/集合
json-libを使用するには、次のパッケージを導入する必要があります.
<span style="font-family:KaiTi_GB2312;font-size:18px;">import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONFunction;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.PropertyFilter;
import net.sf.json.xml.XMLSerializer;</span>

これらは必要に応じて導入され,すべて導入されるわけではない.
1、JSON文字列をjavaObjectに変換する
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="white-space:pre">	</span>@Override
	@RequestMapping("/save.do")
	@ResponseBody
	public Object save(HttpServletRequest request) {
		//              json   
		String inserted = request.getParameter("newRow");</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="white-space:pre">		</span>//     javabean
		JobContentDetail detail = new JobContentDetail();</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="white-space:pre">		</span>//  json       ,     
		if(inserted != null){
		//  string    jsonObject
		JSONObject jsonobj = JSONObject.fromObject(inserted); </span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"><pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 21px;"><span style="white-space:pre">		</span>// json        <span style="font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif,   , PMingLiU, serif;"> </span></span>

detail = (JobContentDetail)JSONObject.toBean(jsonobj, JobContentDetail.class); try {labourservice.saveEntity(detail);} catch (Exception e) {e.printStackTrace();return createErrorMessage(e.getMessage()).toString();}}return createSuccessMessage("操作成功!").toString();}
 
          2、jsonArray  转换成 java list 
  
 

     具体代码和jsonObject转换成javabean一样,唯独不同的是,转javabean使用的是tobean,转list使用的是 toCollection.   

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="white-space:pre">	</span>JSONArray array =JSONArray.fromObject(ens.toString());
	@SuppressWarnings("unchecked")
	List<JobContentDetail> listDetail=(List<JobContentDetail>)JSONArray.toCollection(array, JobContentDetail.class);</span>

四、javaオブジェクト/コレクションをjsonにシーケンス化する
個人的にはjavaBean/listをjsonに変換するのが簡単だと思います.コードを一歩一歩見てみましょう.まず、テストの準備コードは以下の通りです.
<span style="font-family:KaiTi_GB2312;font-size:18px;">@SuppressWarnings({ "deprecation", "unchecked" })
public class JsonlibTest {
    private JSONArray jsonArray = null;
    private JSONObject jsonObject = null;    
    private Student bean = null;    
    @Before
    public void init() {
        jsonArray = new JSONArray(); 
        jsonObject = new JSONObject();        
        bean = new Student();
        bean.setAddress("address");
        bean.setEmail("email");
        bean.setId(1);
        bean.setName("haha");
        Birthday day = new Birthday();
        day.setBirthday("2010-11-22");
        bean.setBirthday(day);
    }    
    @After
    public void destory() {
        jsonArray = null;
        jsonObject = null;
        bean = null;
        System.gc();
    }    
    public final void fail(String string) {
        System.out.println(string);
    }    
    public final void failRed(String string) {
        System.err.println(string);
    }    
}</span>

本格的な呼び出し変換を開始し、
1、まずjavabeanをjsonに変換し、
<span style="font-family:KaiTi_GB2312;font-size:18px;">    fail("==============Java Bean >>> JSON Object==================");
    fail(JSONObject.fromObject(bean).toString());
    fail("==============Java Bean >>> JSON Array==================");
    fail(JSONArray.fromObject(bean).toString());//array       []
    fail("==============Java Bean >>> JSON Object ==================");
    fail(JSONSerializer.toJSON(bean).toString());</span>

出力の結果は次のとおりです.
==============Java Bean >>> JSON Object==================
{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"haha"}
==============Java Bean >>> JSON Array==================
[{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"haha"}]
==============Java Bean >>> JSON Object ==================
{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"haha"}

 
2、javalistをjsonに変換する
<span style="font-family:KaiTi_GB2312;font-size:18px;">@Test
public void writeList2JSON() {
    fail("==============Java List >>> JSON Array==================");
    List<Student> stu = new ArrayList<Student>();
    stu.add(bean);
    bean.setName("jack");
    stu.add(bean);
    fail(JSONArray.fromObject(stu).toString());
    fail(JSONSerializer.toJSON(stu).toString());
}</span>

実行後の出力結果は次のとおりです.
      
==============Java List >>> JSON Array==================
[{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},
{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"}]
[{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"},
{"address":"address","birthday":{"birthday":"2010-11-22"},"email":"email","id":1,"name":"jack"}]

コードをよく見ると、javabeanがjsonオブジェクトに変換されたときにjsonarrayを使用してjavabenをjsonarrayに変換する現象が見つかります.jsonarrayに変換するにはlistでなければならないわけではありません.kjavabeanであってもいいです. 
リストセットを変換する場合は、JSOnArrayまたはJSOnSrializerが提供するシーケンス化方法を使用する必要があります.JSONObjectを使うならfromObjectメソッド変換リストに異常が発生します.通常、JSOnSrializerというJSONシーケンス化メソッドを使用すると、渡されたオブジェクトのタイプを自動的に認識し、対応するJSON文字列に変換します.
json-libはxmlとjavabeanの間の変換もできますが、まだ使用していません.具体的な内容は参考にしてください.
json-libの使用