Simple JSON开发指南

 更新时间:2016年04月29日 11:50:07   作者:虾米  
注意:JSONPauser不是线程安全的,需要的朋友可以参考下

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

json-simple的主页:https://www.jb51.net/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 。

相关文章

  • Idea开发工具之SpringBoot整合JSP的过程

    Idea开发工具之SpringBoot整合JSP的过程

    最近在学习SpringBoot,看到SpringBoot整合jsp,顺带记录一下。本文通过图文实例相结合给大家讲解SpringBoot整合JSP的过程,感兴趣的朋友一起看看吧
    2021-09-09
  • JAVA用for循环打印空心菱形

    JAVA用for循环打印空心菱形

    大家好,本篇文章主要讲的是JAVA用for循环打印空心菱形,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • SpringBoot定时任务动态扩展ScheduledTaskRegistrar详解

    SpringBoot定时任务动态扩展ScheduledTaskRegistrar详解

    这篇文章主要为大家介绍了SpringBoot定时任务动态扩展ScheduledTaskRegistrar类示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • java实现文件重命名的方法

    java实现文件重命名的方法

    这篇文章主要介绍了java实现文件重命名的方法,涉及java针对文件的重命名操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java SpringMVC实现自定义拦截器

    Java SpringMVC实现自定义拦截器

    这篇文章主要为大家详细介绍了SpringMVC实现自定义拦截器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • java服务器的简单实现过程记录

    java服务器的简单实现过程记录

    在线浏览网页离不开服务器,用户发出请求request,服务器做出响应response,提供给用户需要的页面,这篇文章主要给大家介绍了关于java服务器简单实现的相关资料,需要的朋友可以参考下
    2021-11-11
  • java组件commons-fileupload文件上传示例

    java组件commons-fileupload文件上传示例

    这篇文章主要为大家详细介绍了java组件commons-fileupload实现文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Spring应用中使用acutator/refresh刷新属性不生效的问题分析及解决

    Spring应用中使用acutator/refresh刷新属性不生效的问题分析及解决

    在Spring应用收到/actuator/refresh的POST请求后,标注了@RefreshScope以及@ConfiguratioinProperties的bean会被Spring容器重新加载,但是,在实际应用中,并没有按照预期被Spring容器加载,本文将讨论导致这种未按预期刷新的一种原因,感兴趣的朋友可以参考下
    2024-01-01
  • Java基础之自动装箱,注解操作示例

    Java基础之自动装箱,注解操作示例

    这篇文章主要介绍了Java基础之自动装箱,注解操作,结合实例形式分析了java拆箱、装箱、静态导入、注释等相关使用技巧,需要的朋友可以参考下
    2019-08-08
  • Java开发环境jdk 1.8安装配置方法(Win7 64位系统/windows server 2008)

    Java开发环境jdk 1.8安装配置方法(Win7 64位系统/windows server 2008)

    这篇文章主要介绍了Java开发环境配置方法(Win7 64位系统/windows server 2008),需要的朋友可以参考下
    2016-10-10

最新评论