从刚开始接触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的使用