json、javaBean 互相轉化 的工具 —— json-lib

     從剛開始接觸JSON 到現在差不多有兩年時間了,最初接觸JSON只知道是一種輕量級的數據交換格式。它基於JavaScript的一個子集。後來就很少用到了,後來開始使用Easyui ,就不得不跟Json打交道了。但是也一直沒有整理過有關Json的相關知識。直到最近,在做一個項目,前臺要求特別高,僅僅是easyui提供的方法已經沒有辦法滿足需求,所以對jquery ,json ,又好好的使用了一次。這次讓我收穫很大。接下來就跟大家分享一下java中解析json的工具有哪些。

    現在我知道了主要有三種: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的兩個類: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的版本,本示例中使用的是v2.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. 

         如果你是轉換List集合,一定得用JSONArray或是JSONSrializer提供的序列化方法。如果你用JSONObject.fromObject方法轉換List會出現異常,通常使用JSONSrializer這個JSON序列化的方法,它會自動識別你傳遞的對象的類型,然後轉換成相應的JSON字符串。

    json-lib 還可以進行xml 和 javabean之間的轉化,但是我還沒有使用到,具體內容參考:

           json-lib的使用    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章