從剛開始接觸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之間的轉化,但是我還沒有使用到,具體內容參考: