<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
package jansonDemo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class TestJSON { /** * JSON實際上也是鍵值對("key":"value") * key 必須是字串,value 可以是合法的 JSON 資料型別(字串, 數位, 物件, 陣列, 布林值或 null) * value如果是字串,用jsonobj.getString("key")獲取 * value如果是數 字,用jsonobj.getIntValue("key"),jsonobj.getFloatValue("key"),jsonobj.getInteger("key")等基本資料型別及其包裝類的方法獲取 * value如果是布林值,用jsonobj.getBoolean("key"),jsonobj.getBooleanValue("key")獲取 * value如果是數 組,用jsonobj.getJSONArray("key")獲取 * value如果是Object物件,用jsonobj.get("key"),獲取 * value如果是JSONObject物件,用jsonobj.getJSONObject("key")獲取 */ /** * 該方法用於將已有的json字串轉換為json物件,並取出該物件中相應的key對應的value值 * 將已有的字串轉換成jsonobject,用JSON.parseObject(jsonStr)方法 * json中只要是{}就代表一個JSONObject,[]就代表一個JSONArray * 獲取JSONObject物件用JSONObject jsonobject.getJSONObject("key")方法 * 獲取JSONArray物件用JSONObject jsonobject.getJSONArray("key")方法 */ private static void strWritedToJSONObject() { //以下是一個json物件中巢狀一個json子物件 String myJsonObj = "{n" + " "name":"runoob",n" + " "alexa":10000,n" + " "sites": {n" + " "site1":"www.runoob.com",n" + " "site2":"m.runoob.com",n" + " "site3":"c.runoob.com"n" + " }n" + "}"; JSONObject jsonobj = JSON.parseObject(myJsonObj); //將json字串轉換成jsonObject物件 /***獲取JSONObject中每個key對應的value值時,可以根據實際場景中想得到什麼型別就分別運用不到的方法***/ System.out.println(jsonobj.get("name")); //取出name對應的value值,得到的是一個object System.out.println(jsonobj.getString("name")); //取出name對應的value值,得到的是一個String System.out.println(jsonobj.getIntValue("alexa")); //取出name對應的value值,得到的是一個int System.out.println(jsonobj.get("sites")); //取出sites對應的value值,得到的是一個object System.out.println(jsonobj.getString("sites")); System.out.println(jsonobj.getJSONObject("sites")); //取出sites對應的value值,得到一個JSONObject子物件 System.out.println(jsonobj.getJSONObject("sites").getString("site2")); //取出巢狀的JSONObject子物件中site2對應的value值,必須用getJSONObject()先獲取JSONObject /** * 以下是一個json物件中包含陣列,陣列中又包含json子物件和子陣列 */ String myJsonObj2 = "{n" + " "name":"網站",n" + " "num":3,n" + " "sites": [n" + " { "name":"Google", "info":[ "Android", "Google 搜尋", "Google 翻譯" ] },n" + " { "name":"Runoob", "info":[ "菜鳥教學", "菜鳥工具", "菜鳥微信" ] },n" + " { "name":"Taobao", "info":[ "淘寶", "網購" ] }n" + " ]n" + "}"; JSONObject jsonobj2 = JSON.parseObject(myJsonObj2); //將json字串轉換成jsonObject物件 System.out.println(jsonobj2.get("sites")); System.out.println(jsonobj2.getString("sites")); System.out.println(jsonobj2.getJSONArray("sites")); //取出sites對應的value值,得到一個JSONOArray物件 //System.out.println(jsonobj2.getJSONObject("sites")); 不能用該方法,因為sites是一個JSONOArray物件 //取出json物件中sites對應陣列中第一個json子物件的值 System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0)); //得到結果:{"name":"Google","info":["Android","Google 搜尋","Google 翻譯"]} System.out.println(jsonobj2.getJSONArray("sites").get(0)); System.out.println(jsonobj2.getJSONArray("sites").getString(0)); //取出json物件中sites對應陣列中第一個json子物件下面info對應的巢狀子陣列值 System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0).getJSONArray("info")); //得到結果:["Android","Google 搜尋","Google 翻譯"] //取出json物件中sites對應陣列中第一個json子物件下面info對應的巢狀子陣列中第二個值 System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0).getJSONArray("info").getString(1)); //得到結果:Google 搜尋 //依次取出json物件中sites對應陣列中的值 JSONArray array = jsonobj2.getJSONArray("sites"); getJsonArrayItem(array); //依次取出json物件中sites對應陣列中第二個json子物件下面info對應的巢狀子陣列值 JSONArray arr = jsonobj2.getJSONArray("sites").getJSONObject(1).getJSONArray("info"); getJsonArrayItem(arr); } /** * 手動新增物件到一個JSONObject */ private static void writeStrToJSONObject() { JSONObject jsonObject = new JSONObject(); jsonObject.put("name","tom"); jsonObject.put("age",20); JSONArray jsonArray = new JSONArray(); JSONObject jsonArrayObject1 = new JSONObject(); jsonArrayObject1.put("name","alibaba"); jsonArrayObject1.put("info","www.alibaba.com"); JSONObject jsonArrayObject2 = new JSONObject(); jsonArrayObject2.put("name","baidu"); jsonArrayObject2.put("info","www.baidu.com"); jsonArray.add(jsonArrayObject1); jsonArray.add(jsonArrayObject2); jsonObject.put("sites",jsonArray); System.out.println(jsonObject); } /** * 將字串轉為JSONArray */ private static void strToJsonArray() { String arrayStr = "[n" + " {n" + " "name":"alibaba",n" + " "info":"www.alibaba.com"n" + " },n" + " {n" + " "name":"baidu",n" + " "info":"www.baidu.com"n" + " }n" + " ]"; JSONArray array = JSON.parseArray(arrayStr); System.out.println(array); } /** * 依次取出JSONArray中的值 */ private static void getJsonArrayItem(JSONArray array) { for (int i=0; i<array.size(); i++) { System.out.println(array.get(i)); } } //測試類 public static void main(String[] args) { strWritedToJSONObject(); //writeStrToJSONObject(); //strToJsonArray(); } }
最近需要檢驗系統多次返回的json結果是否相同,以保證系統升級後的功能一致,所以產生了編寫json轉換程式的需求。
由於小弟程式設計能力尚淺,有些特殊情況的轉換沒能考慮好,希望各位可以提出,或者貼出更完善的解析程式供大家分享,先在此處拋磚引玉了。
以下程式用於把多層巢狀的json字串轉換為平層的Map,以方便在後續的測試程式中對比結果。
import net.sf.json.JSONArray; import net.sf.json.JSONObject; import java.util.*; import java.util.Map.Entry; /** * Created by chenyuzhi on 17-8-12. */ public class JsonParseUtil { public static String checkFormat(String str){ String _str = str.trim(); if(_str.startsWith("[") && _str.endsWith("]")){ return _str.substring(1,_str.length()-1); } return _str; } /** * 列印Map中的資料 * @param map */ public static void printJsonMap(Map map){ Set entrySet = map.entrySet(); Iterator<Map.Entry<String, Object>> it = entrySet.iterator(); //最外層提取 while(it.hasNext()){ Map.Entry<String, Object> e = it.next(); System.out.println("Key 值:"+e.getKey()+" Value 值:"+e.getValue()); } } /** * JSON 型別的字串轉換成 Map */ public static void parseJSON2Map(Map jsonMap,String jsonStr,String parentKey){ //字串轉換成JSON物件 JSONObject json = JSONObject.fromObject(jsonStr); //最外層JSON解析 for(Object k : json.keySet()){ //JSONObject 實際上相當於一個Map集合,所以我們可以通過Key值獲取Value Object v = json.get(k); //構造一個包含上層keyName的完整keyName String fullKey = (null == parentKey || parentKey.trim().equals("") ? k.toString() : parentKey + "." + k); if(v instanceof JSONArray){ //如果內層還是陣列的話,繼續解析 Iterator it = ((JSONArray) v).iterator(); while(it.hasNext()){ JSONObject json2 = (JSONObject)it.next(); parseJSON2Map(jsonMap,json2.toString(),fullKey); } } else if(isNested(v)){ parseJSON2Map(jsonMap,v.toString(),fullKey); } else{ jsonMap.put(fullKey, v); } } } public static boolean isNested(Object jsonObj){ return jsonObj.toString().contains("{"); } public static void println(Object str){ System.out.println(str); } }
測試程式:
import net.sf.json.JSONArray; import net.sf.json.JSONObject; import java.util.*; import java.util.Map.Entry; /** * Created by chenyuzhi on 17-8-12. */ public class JsonParseUtil { public static void main(String[] args) throws Exception { JsonParseUtil jsonParseUtil = new JsonParseUtil(); jsonParseUtil.test(); } public void test(){ //JSON型別的字串 String strJson = "{a:1,b:2,c:3,d:[{a1:11,a2:22,a3:33},{a1:{a2:222,a3:333}}]}"; Map jsonMap = new HashMap(); parseJSON2Map(jsonMap,checkFormat(strJson),null); printJsonMap(jsonMap); } }
測試結果:
Key 值:a Value 值:1
Key 值:b Value 值:2
Key 值:d.a3 Value 值:33
Key 值:c Value 值:3
Key 值:d.a1 Value 值:11
Key 值:d.a2 Value 值:22
Key 值:d.a1.a3 Value 值:333
Key 值:d.a1.a2 Value 值:222
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45