﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小菜毛毛技术分享-随笔分类-JSON-LIB快速入门</title><link>http://www.blogjava.net/caizh2009/category/41443.html</link><description>与大家共同成长</description><language>zh-cn</language><lastBuildDate>Fri, 28 Aug 2009 18:14:59 GMT</lastBuildDate><pubDate>Fri, 28 Aug 2009 18:14:59 GMT</pubDate><ttl>60</ttl><item><title>JSON-lib入门</title><link>http://www.blogjava.net/caizh2009/archive/2009/08/29/293040.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 28 Aug 2009 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2009/08/29/293040.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/293040.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2009/08/29/293040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/293040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/293040.html</trackback:ping><description><![CDATA[<p>1)JSON简介<br />
2)JSON/LIST转换<br />
3)JSON/MAP转换<br />
4)JSON/动态Bean转换<br />
5)JSON/静态Bean转换<br />
6)JSON/XML输出</p>
<p>1.JSON简介<br />
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式，基于JavaScript，但是不仅仅限于此。<br />
详情可以参考<a href="http://www.json.org/">www.json.org</a><br />
例如一段XML<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
　&lt;shop&gt;<br />
　　&lt;name&gt;饭店&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;city&gt;北京&lt;/city&gt;<br />
　&lt;/shop&gt;<br />
用JSON表示如下：<br />
{<br />
　　"name":"饭店",<br />
　　"city":"北京"<br />
}<br />
XML的解析得考虑子节点父节点关系，而JSON的解析难度相当低，很多控件，尤其是ajax相关的数据交换很多都用json.</p>
<p>2)JSON/LIST转换<br />
本教程解析采用的json-lib，官方网站为<a href="http://json-lib.sourceforge.net/">http://json-lib.sourceforge.net/</a>，本教程参考官方教程<br />
环境需要配置的jar如下<br />
commons-beanutils和ezmorph控制反射<br />
commons-collections是apachecommons的子项目，扩展了java集合类<br />
commons-lang扩展了java.lang包<br />
commons-logging日志类<br />
xom是xml解析类，可以参考<a href="http://www.xom.nu/">www.xom.nu</a><br />
junit单元测试用的jar<br />
json-lib核心jar<br />
项目文件夹中拥有货物参数(Shop)和货物参数列表(ShopList)两个实体<br />
Shop包含name和property两个字段，ShopList包含Shop的列表<br />
对应的json是<br />
String s = "[{name:'重量',property:'p1'},{name:'尺寸',property:'p2'},{name:'显卡类型',property:'p3'},{name:'硬盘容量',property:'p4'},{name:'处理器',property:'p5'},{name:'内存',property:'p6'},{name:'型号',property:'p7'},{name:'货号',property:'p8'},{name:'品牌',property:'p9'}]";<br />
把这样的数据结构作为用户定义个人信息存入数据库可以达到个性化参数的作用，<br />
比如shopex的数据库中很多表就是用的json数据类型。因为用户自己添加的参数的长度是不固定的<br />
比如上述例子就拥有9个用户自定义的参数<br />
当用户需要填写这些参数的时候，需要转化为list，然后在struts2的view去显示<br />
完成的代码可以参考附件的ArrayUtil文件<br />
核心代码仅仅就一行JSONArray jsonArray = JSONArray.fromObject(s);<br />
得到这个jsonArray后要转化为ArrayList，需要用循环遍历，如下<br />
for (int i = 0; i &lt; jsonArray.size(); i++) {<br />
&nbsp;&nbsp;&nbsp;Object o = jsonArray.get(i);<br />
&nbsp;&nbsp;&nbsp;JSONObject jsonObject = JSONObject.fromObject(o);<br />
&nbsp;&nbsp;&nbsp;Shop Person = (Shop) JSONObject.toBean(jsonObject, Shop.class);<br />
&nbsp;&nbsp;&nbsp;list.add(Person);<br />
}<br />
然后得到的list就是普通的ArrayList了</p>
<p>3)JSON/MAP转换<br />
当我们初始化完一个map，放入json可以直接放入<br />
Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();<br />
map.put("name", "重量");<br />
map.put("property", "p1");<br />
JSONObject jsonObject = JSONObject.fromObject(map);<br />
核心代码为<br />
JSONObject jsonObject = JSONObject.fromObject(map);<br />
JsonLib会自动映射<br />
完成例子见附件MapUtil.java</p>
<p><br />
4)JSON/动态Bean转换<br />
所谓动态bean即是java运行的时候根据情况创建的，而不是程序员已经好了的Bean<br />
JsonLib会自动根据Json格式数据创建字段，然后创建一个包含这些字段的Object<br />
本例子中采用JUNIT做单元测试验证，见DynamicBean.java<br />
String s = "{name:'重量',property:'p1'}";<br />
JSONObject jsonObject = JSONObject.fromObject(s);<br />
Object bean = JSONObject.toBean(jsonObject);<br />
assertEquals(jsonObject.get("name"), PropertyUtils.getProperty(bean,"name"));<br />
assertEquals(jsonObject.get("property"), PropertyUtils.getProperty(bean,"property"));</p>
<p><br />
5)JSON/静态Bean转换(StaticBean.java)<br />
JSONLIB在转换的时候会自动查找关系，比如子类和父类<br />
例如JSON数据源<br />
String s = "{'shopList':[{name:'重量',property:'p1'},{name:'尺寸',property:'p2'},{name:'显卡类型',property:'p3'},{name:'硬盘容量',property:'p4'},{name:'处理器',property:'p5'},{name:'内存',property:'p6'},{name:'型号',property:'p7'},{name:'货号',property:'p8'},{name:'品牌',property:'p9'}]}";<br />
存入Map<br />
map.put("shopList", Shop.class);<br />
ShopList shopList = (ShopList) JSONObject.toBean(JSONObject.fromObject(s), ShopList.class, map); <br />
JSONObject.toBean()方法的三个参数分别表示数据源对应的JSON对象，转化后的对象ShopList和数据源map<br />
然后这样也可以取得ShopList<br />
这种方法和动态转换的区别在于，动态转换仅仅只是转为Object<br />
而静态转换是转换为已经定义过的实体类，会自动映射(这点类似Ibatis)</p>
<p>6)JSON/XML输出<br />
如果自己用String的方法转化为XML输出要写很多代码，然后条用JSONLIB，核心代码仅仅一步<br />
String xmlObject = xmlSerializer.write(object);<br />
比如<br />
String s = "{name:'重量',property:'p1'}";<br />
XMLSerializer xmlSerializer = new XMLSerializer();<br />
JSONObject object = JSONObject.fromObject(s);<br />
String xmlObject = xmlSerializer.write(object);<br />
System.out.println(xmlObject);</p>
<p>输出结果为<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;o&gt;<br />
&nbsp; &lt;name type="string"&gt;重量&lt;/name&gt;<br />
&nbsp; &lt;property type="string"&gt;p1&lt;/property&gt;<br />
&lt;/o&gt;</p>
<br />
<br />
<img src ="http://www.blogjava.net/caizh2009/aggbug/293040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-29 00:39 <a href="http://www.blogjava.net/caizh2009/archive/2009/08/29/293040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>