Simple JSON開(kāi)發(fā)指南
Simple JSON是Google開(kāi)發(fā)的Java JSON解析框架,基于Apache協(xié)議。
json-simple的主頁(yè):http://www.dbjr.com.cn/softs/455885.html
下載的文件是:json_simple.jar
System.out.println("=======decode======="); String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]"; Object obj=JSONValue.parse(s); JSONArray array=(JSONArray)obj; System.out.println("======the 2nd element of array======"); System.out.println(array.get(1)); System.out.println(); JSONObject obj2=(JSONObject)array.get(1); System.out.println("======field \"1\"=========="); System.out.println(obj2.get("1")); s="{}"; obj=JSONValue.parse(s); System.out.println(obj); s="[5,]"; obj=JSONValue.parse(s); System.out.println(obj); s="[5,,2]"; obj=JSONValue.parse(s); System.out.println(obj);
JSONObject是繼承Map的,而JSONArray是繼承List的,所以你可以用Map和List的標(biāo)準(zhǔn)方式來(lái)使用JSONObject和JSONArray。
而JSONValue則可以使用數(shù)組也可以用對(duì)象。
例子2:快速的方式,使用JSONParser
JSONParser parser=new JSONParser(); System.out.println("=======decode======="); String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]"; Object obj=parser.parse(s); JSONArray array=(JSONArray)obj; System.out.println("======the 2nd element of array======"); System.out.println(array.get(1)); System.out.println(); JSONObject obj2=(JSONObject)array.get(1); System.out.println("======field \"1\"=========="); System.out.println(obj2.get("1")); s="{}"; obj=parser.parse(s); System.out.println(obj); s="[5,]"; obj=parser.parse(s); System.out.println(obj); s="[5,,2]"; obj=parser.parse(s); System.out.println(obj);
使用JSONParser需要捕獲異常。
例子3:異常處理
String jsonText = "[[null, 123.45, \"a\\tb c\"]}, true"; JSONParser parser = new JSONParser(); try{ parser.parse(jsonText); } catch(ParseException pe){ System.out.println("position: " + pe.getPosition()); System.out.println(pe); }
執(zhí)行結(jié)果:
position:25 Unexpected token RIGHT BRACE(}) at position 25.
例子4:容器工廠
使用使用ContainerFactory類來(lái)創(chuàng)建一個(gè)容器工廠。
String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}"; JSONParser parser = new JSONParser(); ContainerFactory containerFactory = new ContainerFactory(){ public List creatArrayContainer() { return new LinkedList(); } public Map createObjectContainer() { return new LinkedHashMap(); } }; try{ Map json = (Map)parser.parse(jsonText, containerFactory); Iterator iter = json.entrySet().iterator(); System.out.println("==iterate result=="); while(iter.hasNext()){ Map.Entry entry = (Map.Entry)iter.next(); System.out.println(entry.getKey() + "=>" + entry.getValue()); } System.out.println("==toJSONString()=="); System.out.println(JSONValue.toJSONString(json)); } catch(ParseException pe){ System.out.println(pe); }
結(jié)果如下:
==iterate result== first=>123 second=>[4,5,6] third=>789 ==toJSONString()== {"first":123,"second":[4,5,6],"third":789}
class KeyFinder implements ContentHandler{ private Object value; private boolean found = false; private boolean end = false; private String key; private String matchKey; public void setMatchKey(String matchKey){ this.matchKey = matchKey; } public Object getValue(){ return value; } public boolean isEnd(){ return end; } public void setFound(boolean found){ this.found = found; } public boolean isFound(){ return found; } public void startJSON() throws ParseException, IOException { found = false; end = false; } public void endJSON() throws ParseException, IOException { end = true; } public boolean primitive(Object value) throws ParseException, IOException { if(key != null){ if(key.equals(matchKey)){ found = true; this.value = value; key = null; return false; } } return true; } public boolean startArray() throws ParseException, IOException { return true; } public boolean startObject() throws ParseException, IOException { return true; } public boolean startObjectEntry(String key) throws ParseException, IOException { this.key = key; return true; } public boolean endArray() throws ParseException, IOException { return false; } public boolean endObject() throws ParseException, IOException { return true; } public boolean endObjectEntry() throws ParseException, IOException { return true; } }
String jsonText ="{\"first\": 123, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}"; JSONParser parser =newJSONParser(); KeyFinder finder =newKeyFinder(); finder.setMatchKey("id"); try{ while(!finder.isEnd()){ parser.parse(jsonText, finder,true); if(finder.isFound()){ finder.setFound(false); System.out.println("found id:"); System.out.println(finder.getValue()); } } } catch(ParseException pe){ pe.printStackTrace(); }
found id: id1 found id: 123 found id: null
class Transformer implements ContentHandler{ private Stack valueStack; public Object getResult(){ if(valueStack == null || valueStack.size() == 0) return null; return valueStack.peek(); } public boolean endArray () throws ParseException, IOException { trackBack(); return true; } public void endJSON () throws ParseException, IOException {} public boolean endObject () throws ParseException, IOException { trackBack(); return true; } public boolean endObjectEntry () throws ParseException, IOException { Object value = valueStack.pop(); Object key = valueStack.pop(); Map parent = (Map)valueStack.peek(); parent.put(key, value); return true; } private void trackBack(){ if(valueStack.size() > 1){ Object value = valueStack.pop(); Object prev = valueStack.peek(); if(prev instanceof String){ valueStack.push(value); } } } private void consumeValue(Object value){ if(valueStack.size() == 0) valueStack.push(value); else{ Object prev = valueStack.peek(); if(prev instanceof List){ List array = (List)prev; array.add(value); } else{ valueStack.push(value); } } } public boolean primitive (Object value) throws ParseException, IOException { consumeValue(value); return true; } public boolean startArray () throws ParseException, IOException { List array = new JSONArray(); consumeValue(array); valueStack.push(array); return true; } public void startJSON () throws ParseException, IOException { valueStack = new Stack(); } public boolean startObject () throws ParseException, IOException { Map object = new JSONObject(); consumeValue(object); valueStack.push(object); return true; } public boolean startObjectEntry (String key) throws ParseException, IOException { valueStack.push(key); return true; } }
String jsonString = <Input JSON text>; Object value = null; JSONParser parser = new JSONParser(); Transformer transformer = new Transformer(); parser.parse(jsonString, transformer); value = transformer.getResult();
String jsonString =<Input JSON text>; Object value =null; JSONParser parser =newJSONParser(); value = parser.parse(jsonString);
json_encode — 對(duì)變量進(jìn)行 JSON 編碼。
說(shuō)明:string json_encode ($value ),返回 value 值的 JSON 形式。
參數(shù):待編碼的 value ,除了resource 類型之外,可以為任何數(shù)據(jù)類型
該函數(shù)只能接受 UTF-8 編碼的數(shù)據(jù)(譯注:指字符/字符串類型的數(shù)據(jù))
返回值:編碼成功則返回一個(gè)以 JSON 形式表示的 string 。
相關(guān)文章
Java線程池必知必會(huì)知識(shí)點(diǎn)總結(jié)
這篇文章主要給大家介紹了關(guān)于Java線程池必知必會(huì)知識(shí)點(diǎn)的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02javax.persistence中@Column定義字段類型方式
這篇文章主要介紹了javax.persistence中@Column定義字段類型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11java、python、JavaScript以及jquery循環(huán)語(yǔ)句的區(qū)別
本篇文章主要介紹java、python、JavaScript以及jquery的循環(huán)語(yǔ)句的區(qū)別,這里整理了它們循環(huán)語(yǔ)句語(yǔ)法跟示例,以便大家閱讀,更好的區(qū)分它們的不同2016-07-07java 集合并發(fā)操作出現(xiàn)的異常ConcurrentModificationException
Map在遍歷時(shí)候通常 現(xiàn)獲得其鍵值的集合Set,然后用迭代器Iterator來(lái)對(duì)Map進(jìn)行遍歷。2009-06-06RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解
這篇文章主要介紹了RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解,在?RocketMQ?5.0?中,更加強(qiáng)調(diào)了客戶端類型的概念,尤其是消費(fèi)者類型,為了滿足多樣的?RocketMQ?中一共有三種不同的消費(fèi)者類型,分別是?PushConsumer、SimpleConsumer?和?PullConsumer,需要的朋友可以參考下2023-10-10SpringCloud的Gateway網(wǎng)關(guān)詳解
這篇文章主要介紹了SpringCloud的Gateway網(wǎng)關(guān)詳解,Gateway 是 Spring Cloud 官方推出的一個(gè)基于 Spring 5、Spring Boot 2 和 Project Reactor 的 API 網(wǎng)關(guān)實(shí)現(xiàn),本文將介紹 Spring Cloud Gateway 的基本概念、核心組件以及如何配置和使用它,需要的朋友可以參考下2023-09-09JAVA后臺(tái)轉(zhuǎn)換成樹(shù)結(jié)構(gòu)數(shù)據(jù)返回給前端的實(shí)現(xiàn)方法
這篇文章主要介紹了JAVA后臺(tái)轉(zhuǎn)換成樹(shù)結(jié)構(gòu)數(shù)據(jù)返回給前端的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03javascript checkbox全選和反選的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了javascript checkbox全選和反選的簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-05-05