PS:當你的能力還駕馭不了你的目標時,那你需要沉下心來歷練...
學習內容:
1.Json的使用...
2.Json信息過濾...
3.從網絡上獲取Json數據...
4.解析Json數據獲取各個屬性...
使用Json首先需要下載官方提供的一些jar文件...引用內部提供好的接口...才能夠實現Json數據的獲取....一共需要六個jar包...我已經進行了上傳...大家可以直接下載...
jar下載地址:http://files.cnblogs.com/files/RGogoing/json.rar
下載好了這些jar之后,直接導入就行了...接下來就說真正的內容了...
1.Json的使用...
i.什么是Json...
其實Json和XML文件都一樣...它是一種輕量級的數據交換格式。它基於ECMAScript的一個子集...JSON采用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。(來自百度)..
但是現在使用XML來完成數據交互並不是非常的多,但是並不意味着Json取代了XML,XML是非常強大的,有很多的事情都是需要使用到XML的...Json只是在數據交互上比XML更有優勢而已,使用的更加的廣泛,當然數據交互用XML也是完全沒有任何問題的....只是Json在這方面的優勢要強於XML...至於二者的優缺點我就不提了,百度上有很多關於二者的對比...
ii.Json的數據格式...
Json的數據格式才是我們關心的東西...
第一種:非常簡單的一種數據格式...類似於Java里的鍵值對...
{ "姓名":"Darker", "年齡":20 }
第二種:其實都差不多...這種就類似於數組的格式...好比一個List中保存着HashMap...
{ "學生": [ {"姓名":"Darker","年齡":20}, {"姓名":"ClearLove","年齡":22} ] }
iii.如何在Java應用程序中生成一個Json數據呢?
其實也是非常的簡單的...這里需要使用到JSONObject這個類來生成...JSONObject使用JavaBean或者是Map來生成Json數據...
何為Java Bean
JavaBean到底是個什么玩意...其實這個概念很多人都知道,但是不知道Java Bean到底是個什么東西...其實Java Bean是一種慣用模式或規定...這些規定包括getXXX, setXXX, isXXX, addXXXListener等等...遵守這些規定的類可以被用於若干工具和庫...還是很抽象..舉個例子來理解吧....
這個類用來實現一個鏈表...這里定義了一個size屬性,用來說明鏈表的大小....
public final class JavaIntList { static class Node { public Node next; public int value; } public Node head; public int size; } JavaIntList myList = new JavaIntList(); System.out.println(myList.size);//調用方法..獲取鏈表的長度...
然后這個類就被發布了..發布成了一個java.jar文件...成為了一個開發需要用的類庫...但是某一天我們為了節省內存,我們通過修改java.jar文件用另一種方式獲取size...方式如下...然后發布成了java_1.jar
public final class JavaIntList { static final class Node { public Node next; public int value; } public Node head; public int getSize() { Node n = head; int i = 0; while (n != null) { n = n.next; i++; } return i; } }
這樣改的結果可想而知,凡是在java.jar開發的應用程序,在升級java_1.jar之后全部都無法正常使用,因為java_1.jar已經看不到size這個屬性值了...這就導致了沒有向后進行兼容..所以在設計標准庫的時候決不允許public int size 這樣的代碼出現...只能是下面這種方式...以至於在以后修改標准庫的時候具備向后兼容...這種慣用手法和規定就被稱為Java Bean..
private int size; public int getSize() { return size; }
其實這就是個Java Bean...所有的屬性的定義,賦值,獲取...等等都只能用這種規定的方式...這就是Java Bean...
package json; public class User { private String username; private String userpassword; private String userid; public String getuserid(){ return userid; } public String getusername(){ return username; } public String getuserpassword(){ return userpassword; } public void setuserid(String userid){ this.userid=userid; } public void setusername(String name){ this.username=name; } public void setuserpassword(String password){ this.userpassword=password; } }
介紹完了這些...就可以正式的說一下如何使用JSONObject生成Json數據了...
第一種使用Java Bean生成Json數據...
Java Bean :User類....
package json; public class User { private String username; private String userpassword; private String userid; public String getuserid(){ return userid; } public String getusername(){ return username; } public String getuserpassword(){ return userpassword; } public void setuserid(String userid){ this.userid=userid; } public void setusername(String name){ this.username=name; } public void setuserpassword(String password){ this.userpassword=password; } }
主函數:通過下面的方式就實現了Json數據的生成,以及獲取的過程....
package json; import net.sf.json.JSONObject; public class Json { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub User user=new User(); /* * 通過JavaBean構建一個Json數據... * */ user.setusername("Darker"); user.setuserpassword("49681888"); user.setuserid("1"); JSONObject json=JSONObject.fromObject(user); System.out.println(json.toString()); } }
第二種JSONObject通過Map來生成Json數據信息....並獲取數據信息...
package json; import java.util.HashMap; import net.sf.json.JSONObject; public class Json { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub /* * 通過map生成Json數據... * */ HashMap<Object, Object>usermap=new HashMap<Object, Object>(); usermap.put("username", "Darker"); usermap.put("userpassword", "49681888"); usermap.put("userid","1"); JSONObject json_1=JSONObject.fromObject(usermap); System.out.println(json_1.toString()); } }
這里我們可以看到,獲取到Json數據的方式是使用JSONObject.fromObject()方法實現的...不得不說看了源碼部分真是覺得在數據的獲取上以及對象的初始化上做的非常的好...Json數據的類型只能是數字,字符串,邏輯值...如果不滿足這些情況,返回一個空對象...源碼如下...
if (JSONUtils.isNumber(object) || JSONUtils.isBoolean(object) || JSONUtils.isString(object)){ return new JSONObject(); }
public JSONObject(){ this.properties = new ListOrderedMap(); } public JSONObject(boolean isNull){//用的很少... this(); this.nullObject = isNull; }
這里對象的初始化使用了ListOrderMap,ListOrderMap是List和Map優勢結合的一種擴展...因為List保存的值是有序的,Map在查詢數據的時候是非常高效的..因此結合了這二者的優點存儲數據既是有序的,並且在查詢的過程也是高效的...ListOrderMap就具備這個特點...擴展了兩個集合類...
public static JSONObject fromObject(Object object){ return fromObject(object, new JsonConfig()); }
最后調用fromObject方法...通過JsonConfig的默認配置獲取所有的數據信息....
2.Json信息過濾...
我們可以看到,上面通過調用fromObject()方法,使用默認的JsonConfig配置屬性,可以獲取所有的Json數據信息...但是如果我們想要獲取的信息只是Json數據的某一些部分呢?那么我們就需要使用到過濾的方式,把不想要的數據信息直接過濾掉,就可以獲取到指定的數據信息了...過濾信息有三種方式...在這里進行介紹...
i.使用一個類實現JsonString接口...覆蓋內部的toJsonString()方法...
User類:
實現了userid屬性的過濾....
package json; import net.sf.json.JSONString; public class User implements JSONString{ private String username; private String userpassword; private String userid; /** * 實現過濾的方式...重寫toJSONString()接口... * * */ @Override public String toJSONString() { // TODO Auto-generated method stub return "{\"username\":\"" + username + "\",\"userpassword\":\"" + userpassword + "\"}"; } public String getuserid(){ return userid; } public String getusername(){ return username; } public String getuserpassword(){ return userpassword; } public void setuserid(String userid){ this.userid=userid; } public void setusername(String name){ this.username=name; } public void setuserpassword(String password){ this.userpassword=password; } }
主函數:
package json; import net.sf.json.JSONObject; public class Json { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub User user=new User(); user.setusername("Darker"); user.setuserpassword("49681888"); user.setuserid("1"); JSONObject json=JSONObject.fromObject(user); System.out.println(json.toString()); } }
ii.配置JSONConfig...通過使用JSONConfig.setExclude()方法設置過濾的屬性...這里就不再貼出User類了...
這里我們可以看到,通過使用setExclude()方法...過濾掉了userid屬性...
package json; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; public class Json { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub User user=new User(); user.setusername("Darker"); user.setuserpassword("49681888"); user.setuserid("1"); /** * 實現屬性過濾的第二種方式...配置JSONConfig.... * */ JsonConfig config=new JsonConfig(); /* * 設置不包含的屬性... * */ config.setExcludes(new String[]{"userid"}); JSONObject object=JSONObject.fromObject(user, config); System.out.println(object.toString()); } }
iii.使用PropertyFilter實現屬性過濾....
package json; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.util.PropertyFilter; public class Json { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub User user=new User(); user.setusername("Darker"); user.setuserpassword("49681888"); user.setuserid("1"); /** * 第三種方式...使用propertyFilter...進行過濾... * */ JsonConfig config=new JsonConfig(); config.setJsonPropertyFilter(new PropertyFilter() { /** * arg0:屬性擁有者... * arg1: 屬性名字... * arg2: 屬性值... * * */ @Override public boolean apply(Object arg0, String arg1, Object arg2) { // TODO Auto-generated method stub return arg0 instanceof User && arg1.equals("userid"); } }); JSONObject json=JSONObject.fromObject(user,config); System.out.println(json.toString()); } }
以上就是三種實現屬性過濾的方式...可以根據情況選用特定的方式....
3.從網絡上獲取Json數據...
一般在開發中,我們的數據格式一般都是保存在服務器上的...那么我們需要通過URL來獲取數據信息....下面這里只是提供了一個方法..其實就是通過URL的形式來完成數據信息的傳遞.這樣我們就得到了Json數據...
public static String loadJson (String url) { StringBuilder json = new StringBuilder(); try { URL urlObject = new URL(url); URLConnection uc = urlObject.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream())); String inputLine = null; while ( (inputLine = in.readLine()) != null) { json.append(inputLine); } in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return json.toString(); }
但是僅僅得到的是整個JSON的字符串,只是對整個結果集的一個處理,那么如何獲取其中的各個屬性呢?這才是至關重要的....
4.解析Json數據獲取各個屬性...
下面就是獲取每一個Json值,然后進行保存的一個過程...這里我采用JsonArray的方式,將Json數據轉換成Json數組的形式...
當然我們也可以使用Google官方為我們提供了Gson..調用其中內部的方法就能夠獲取各個屬性信息...不過需要使用到其他的jar...這里我就不進行介紹了...使用Gson只需要調用一些方法其實就能搞定了....大家可以百度...
package json; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class Json { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //這是一段Json數據...比如說就通過URL獲取到的... String json="{'user':" + "[ " + "{'userid':'1' , 'username':'darker' , 'userpassword':'49681888'}," + "{'userid':'2' , 'username':'darker_1' , 'userpassword':'49681888'}," + "{'userid':'3' , 'username':'darker_2' , 'userpassword':'49681888'} " + "]" + "}"; //s字符串包含着每個字段的所有屬性... String s[]=new String[]{"userid","username","userpassword"}; //以集合的方式,將數據信息進行保存... List<Map<String, Object>>list=new ArrayList<Map<String,Object>>(); /** * * 網上有很多方式是JSONObject jsonObject=new JSONObject(json);的方式來初始化對象... * 但是這種方式在我使用的json-lib-2.4版本下會直接報錯... * 因此使用了fromObject方法進行對象的初始化... * * */ JSONObject jsonObject=JSONObject.fromObject(json); try { //將Json數據轉化成數組的形式...user就是整個數組名稱... JSONArray array=jsonObject.getJSONArray("user"); for(int i=0;i<array.size();i++){ /** * 這里使用了optXXX方法...目的是避免發生異常.. * 如果我們使用getXXX方法的話,那么key值就必須存在...一旦不存在就會異常... * 因此使用了optXXX方法... * */ /** * 下面這個對象保存的是這些數據...對應不同的i值...數據也就不同... * i=0; * * {'userid':'1' , 'username':'darker' , 'userpassword':'49681888'} * * i=1 * * {'userid':'2' , 'username':'darker_1' , 'userpassword':'49681888'} * * 以此類推... * */ JSONObject object= (JSONObject) array.opt(i); Map<String, Object>map=new HashMap<String, Object>(); for(String str:s){ //循環遍歷,把所有的值都保存在Map中 //把object的值進行保存... map.put(str, object.get(str)); } //最后使用List保存Map list.add(map); } } catch (Exception e) { // TODO: handle exception } } }
其實解析各個屬性的思路還有很多,比如說我們獲取到Json字符串之后,通過Java Bean進行轉換...然后覆蓋其中的toJsonString()方法...自然也可以獲取到其中的各個屬性...在實際的開發中Json數據有可能更加的復雜,但是我們只要根據具體數據進行具體分析,就能夠從數據中獲取各個屬性,來完成更多的操作...
比如說更復雜的...我們想要獲取rect1中的所對應的數據信息...
package json; import net.sf.json.JSONObject; public class Json { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub /* * 讀取多重Json.... * */ String jsonStr = "{states:{rect1:{type:'start',text:{text:'開始'}, " + "attr:{ x:448, y:105, width:50, height:50}, " + "props:{text:{value:'開始'},temp1:{value:''}," + "temp2:{value:''}}},rect2:{type:'state',text:{text:'camel_element'}, " + "attr:{ x:431, y:224, width:100, height:50}, props:{text:{value:'camel_element'}," + "temp1:{value:'http://www/baidu.com'}}},rect3:{type:'end',text:{text:'結束'}, " + "attr:{ x:454, y:365, width:50, height:50}, props:{text:{value:'結束'}," + "temp1:{value:''},temp2:{value:''}}}},paths:{path4:{from:'rect1',to:'rect2', dots:[]," + "text:{text:'TO camel_element'},textPos:{x:0,y:-10}, props:{text:{value:''}}}," + "path5:{from:'rect2',to:'rect3', dots:[],text:{text:'TO 結束'},textPos:{x:0,y:-10}, " + "props:{text:{value:''}}}},props:{props:{name:{value:'新建流程'},key:{value:''}," + "desc:{value:''}}}}"; JSONObject jsonObj = JSONObject.fromObject(jsonStr); System.out.println(jsonObj.getJSONObject("states").getJSONObject("rect1")); } }
這里其實就是給大家一個思路而已,具體的情況還是需要我們具體進行思考...只要思考,沒有解決不了的問題....
Author By: Darker