首页 > 编程 > Java > 正文

Simple JSON开发指南

2019-11-26 14:23:49
字体:
来源:转载
供稿:网友

Simple JSON是Google开发的Java JSON解析框架,基于Apache协议。

json-simple的主页://www.VeVB.COm/softs/455885.html

下载的文件是:json_simple.jar

例子1:很方便的方式,使用JSONValue

 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的标准方式来使用JSONObject和JSONArray。

而JSONValue则可以使用数组也可以用对象。

例子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);   } 

执行结果:

position:25 Unexpected token RIGHT BRACE(}) at position 25.

 

例子4:容器工厂

使用使用ContainerFactory类来创建一个容器工厂。

 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);   } 

 结果如下:

==iterate result== first=>123 second=>[4,5,6] third=>789 ==toJSONString()== {"first":123,"second":[4,5,6],"third":789}
 如果你不使用容器工厂,Simple-JSON默认使用JSONObject和JSONArray。
 例子5:可停的SAX式内容处理
SimpleJSON推荐一种简单的可停的SAX方式的内容处理方式来处理文本流,用户可以停留在逻辑输入流的任意点,接着去处理其他逻辑,然后再继续先前的处理。不用等待整个流处理完毕。以下是一个例子。
KeyFinder.java:
 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;   }  } 
Main logic:
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
例子6:整个对象图,用SAX式的解析
 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;    }       } 
Main方式逻辑:
 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);
注意:
JSONPauser不是线程安全的。 

json_encode ― 对变量进行 JSON 编码。

说明:string json_encode ($value ),返回 value 值的 JSON 形式。

参数:待编码的 value ,除了resource 类型之外,可以为任何数据类型

该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)

返回值:编码成功则返回一个以 JSON 形式表示的 string 。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表