`
Fly_m
  • 浏览: 259633 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

一种简单的json解析方法

    博客分类:
  • java
阅读更多

       在前面的新闻系统设计中,常常会用到有关ajax的请求,如对文章类别的动态调用.本来struts2提供了一个json的插件,不过在开发的时候还不知道.自己写了一个,还将就吧.
      基本原理,就是改变struts2的返回类型,原来的返回类型为string,如果返回类型为void即不返回任何类型,而改由struts2的的ServletContext对象获得用到输出的out对象,将json对象输出到页面上,同样可以达到ajax格式效果.最后在页面上作了小小的操作,将json格式的字符串变成js对象进行调用,以完成相应操作.流程如下:

  1. 获得response对象,进行获得printWriter对象
  2. 将想要返回给页面上的对象转化成json格式的字符串
  3. 由printWriter将json字符串写到页面输出流(通常是被js来获得结果)
  4. 页面处理json字符串,转化成js对象,传入回调函数进行调用

这里主要用到几个对象ServletContext(这个是struts2的工具对象,可获得request,response等对象),JsonUtil(自己写的一个类,用到转化对象),protype.js(用到提交ajax请求,接收返回结果),此外,还有一个jsonUtil的辅助类BeanUtil(用到将javaBean转化成map对象).这里主要贴出jsonUtil的转换方法和BeanUtil的辅助方法,看这种方式是否合适.

java 代码
  1. public class JsonUtil {   
  2.     public JsonUtil() {}   
  3.   
  4.   
  5.     private static boolean isSimpleType(Class clazz) {   
  6.         return clazz.isPrimitive() || String.class.isAssignableFrom(clazz) || Number.class.isAssignableFrom(clazz)   
  7.                 || java.util.Date.class.isAssignableFrom(clazz) || Boolean.class.isAssignableFrom(clazz)   
  8.                 || Character.class.isAssignableFrom(clazz);   
  9.     }   
  10.   
  11.   
  12.     public static String convertToJson(Object obj) {   
  13.         JsonHandle jsonHandle = new JsonHandle();   
  14.   
  15.         return jsonHandle.convertToJson(0, obj).toString();   
  16.     }   
  17.   
  18.     private static class JsonHandle {   
  19.         public static final int DEFAULT_DEPTH = 10;   
  20.   
  21.   
  22.         public StringBuffer convertToJson(int depth, Object obj) {   
  23.             StringBuffer sb = new StringBuffer();   
  24.   
  25.             if(obj == null) {   
  26.                 sb.append("null");   
  27.             } else if(isSimpleType(obj.getClass())) {   
  28.                 if((obj instanceof String) || (obj instanceof java.util.Date)) {   
  29.                     sb.append("\"").append(obj).append("\"");   
  30.                 } else if(obj instanceof Character) {   
  31.                     sb.append("'").append(obj).append("'");   
  32.                 } else {   
  33.                     sb.append(obj);   
  34.                 }   
  35.             } else if(obj instanceof Collection) {   
  36.                 boolean hibernateFlag;   
  37.                 try {   
  38.                     ((Collection) obj).size();   
  39.                     hibernateFlag = true;   
  40.                 } catch(Exception ex) {   
  41.                     hibernateFlag = false;   
  42.                 }   
  43.   
  44.                 if(hibernateFlag) {   
  45.                     sb.append("[");   
  46.   
  47.                     for(Iterator iterator = ((Collection) obj).iterator(); iterator.hasNext();) {   
  48.                         sb.append(convertToJson(depth, iterator.next()));   
  49.   
  50.                         if(iterator.hasNext()) {   
  51.                             sb.append(",");   
  52.                         }   
  53.                     }   
  54.   
  55.                     sb.append("]");   
  56.                 } else {   
  57.                     sb.append("null");   
  58.                 }   
  59.   
  60.             } else if(obj.getClass().isArray()) {   
  61.                 sb.append("[");   
  62.   
  63.                 int max = java.lang.reflect.Array.getLength(obj);   
  64.   
  65.                 for(int i = 0; i < max; i++) {   
  66.                     if(i > 0) {   
  67.                         sb.append(",");   
  68.                     }   
  69.   
  70.                     sb.append(convertToJson(depth, java.lang.reflect.Array.get(obj, i)));   
  71.                 }   
  72.   
  73.                 sb.append("]");   
  74.             } else if(java.util.Map.class.isAssignableFrom(obj.getClass())) {   
  75.                 sb.append("{\n");   
  76.   
  77.                 for(Map.Entry e : ((Map) obj).entrySet()) {   
  78.                     if(!(e.getKey() instanceof String))//如果键值不是字符串,则跳过.   
  79.                         continue;   
  80.                     sb.append(e.getKey()).append(":");   
  81.   
  82.                     if(depth <= DEFAULT_DEPTH) {   
  83.                         sb.append(convertToJson(depth + 1, e.getValue()));   
  84.                     } else {   
  85.                         sb.append("undefined");   
  86.                     }   
  87.   
  88.                     sb.append(",");   
  89.                 }   
  90.   
  91.                 if(sb.length() > 3) {   
  92.                     sb.deleteCharAt(sb.length() - 1);   
  93.                 }   
  94.   
  95.                 sb.append("\n}");   
  96.             } else {   
  97.                 Map map = null;   
  98.   
  99.                 try {   
  100.                     map = BeanUtil.getPropertiesByReflect(obj);   
  101.                 } catch(Exception ex) {   
  102.                     ex.printStackTrace();   
  103.                 }   
  104.   
  105.                 sb.append(convertToJson(depth, map));   
  106.             }   
  107.   
  108.             return sb;   
  109.         }   
  110.     }   
  111. }  

以及辅助类:

java 代码
  1. public class BeanUtil {   
  2.   
  3.     /** Creates a new instance of BeanUtil */  
  4.     private BeanUtil() {   
  5.     }   
  6.   
  7.     public static Map getPropertiesByReflect(Object obj) throws Exception {   
  8.         if(obj == null)   
  9.             return null;   
  10.         Field[] fields = obj.getClass().getDeclaredFields();   
  11.         if(fields == null || fields.length == 0)   
  12.             return null;   
  13.         Map map = new HashMap();   
  14.         AccessibleObject.setAccessible(fields, true);   
  15.         for(Field field : fields) {   
  16.             if(!field.getName().equals("serialVersionUID") && field.getAnnotation(Fly_m.class) == null)   
  17.                 map.put(field.getName(), field.get(obj));   
  18.   
  19.         }   
  20.         if(map.size() < 1)   
  21.             return null;   
  22.         return map;   
  23.     }   
  24.   
  25. }  


        在JsonUtil里,主要对一个对象进行分析,采取不同的策略对不同类型的对象进行递归性地转化.对应集合类型,采用迭代地方式.而进行通用的javaBean对象,则先将其转化成一个map对象,然后再进行转化.在本程序中,用到了一个转化深度地概念,主要是防止某些类地无限属性或者递归属性.考虑到并不需要将对象中的每一个属性进行转化,这里引入了一个相当于Traisient的注释@Fly_m,作用到字段上(因为对javaBean的解析是以反射来解析的).如果解析的属性存在这个注解,则被忽略.(一开始想要transient的modifier属性,发现与hibernate相冲突(hiberante对于transient的属性也不会解析?).

#-----------------------------
在客户端,我采用protype.js提供的基本的ajax调用方法Ajax.Request(action,{method,parameters,onComplete,onException)这种访求进行服务器请求,同时写了一个小小的辅助js进行调用,以方便页面调用.Fly_m.js,使用这个js后,通常的调用被简单化为m_ylf.invoke(actionName,method,parameters,callBack).这样,只需要四个参数,同时内置调试参数设置,以及传递给callBack对象的不再是一个xmlHttpRequest对象,而是一个已经eval好的js对象,让使用更加方便.源码如下:

js 代码
  1. var m_ylf = function() {};   
  2. m_ylf.defaultPath = "js";   
  3. m_ylf.preDebug = false;   
  4. m_ylf.postDebug = false;   
  5. m_ylf.prefix="";   
  6.   
  7. m_ylf.setPrefix = function(pre) {   
  8.     m_ylf.prefix = pre;   
  9. }   
  10.   
  11. m_ylf.setPreDebug = function(pre){   
  12.     m_ylf.preDebug = pre;   
  13. }   
  14.   
  15. m_ylf.setPostDebug = function(post) {   
  16.     m_ylf.postDebug = post;   
  17. }   
  18.   
  19. m_ylf.handleException = function(exception) {   
  20.     window.alert("Error -> " + exception.message);   
  21. }   
  22.   
  23. m_ylf.invoke = function(actionName, param, callBack) {   
  24.        
  25.     if(arguments.length != 3)   
  26.         return;   
  27.     if(typeof callBack != "function") {   
  28.         callBack = function() {};   
  29.     }       
  30.        
  31.     if(actionName == null || actionName == "")   
  32.         return;   
  33.   
  34.     var params = null;   
  35.     if(param == null || param == "")   
  36.         params = "";   
  37.     else    
  38.         params = param;   
  39.        
  40.     if(m_ylf.preDebug)   
  41.         alert(params);   
  42.        
  43.        
  44.     var action = actionName + ".p";   
  45.     if(m_ylf.prefix != null && m_ylf.prefix != "")   
  46.         action = m_ylf.prefix + action;   
  47.        
  48.     new Ajax.Request(action,   
  49.         {method:"get",   
  50.          parameters:params,            
  51.          onComplete:function(data) {   
  52.             if(m_ylf.postDebug) {   
  53.                 window.alert(data.responseText);   
  54.             }   
  55.                           
  56.             var temp = "(" + data.responseText + ")";   
  57.             temp = eval(temp);   
  58.   
  59.             callBack(temp);   
  60.          },   
  61.          onException:m_ylf.handleException   
  62.          });   
  63. }  

不过有个小小的缺点,就是这个js只是符合我自己的系统设计,如果想要通用些,就需要改变其中第44行的action定义,不过我想这通常没有再大的问题吧.preDebug属性可查看请求参数,而postDebug可查看返回给客户端的json字符串,以进行相关的结果跟踪.

我想这个小小的json转化类帮助一些小的开发还行,大的开发就不行了,因为可以涉及到对象的解析,以及生成json字符串的速度.不过对于要求不太高的应用还是足够了.而且页面上的请求都是最基本的请求,完全可以在基础之上进行添加新的功能.以后有想法再在上面作些文章.
相关源码放在附件中,需要的同学们可下来看看.

  • Fly_m.rar (592 Bytes)
  • 描述: 自定义js
  • 下载次数: 99
  • util.rar (2.3 KB)
  • 描述: json格式转化函数
  • 下载次数: 140
分享到:
评论
4 楼 liberD 2010-07-17  
哥们,你很猛!我现在的项目中也遇到了这个问题。需要进行JSON和Bean反复转换。使用的就是Google的plugin,感觉很不爽。有机会,聊聊,向你请教一些,这个东西怎么办?!
3 楼 wj539h 2008-07-26  
兄弟,您太猛了,虽然我没看过google那个JSON插件的源码,但是我觉得你如果自己写的话一点意义没有
2 楼 qiancaoduwu 2008-07-08  
老大 很猛 ,虽然我才看明白一点!!
1 楼 qiancaoduwu 2008-07-08  

相关推荐

    三种json解析方法

    在“三种json解析库举例”这个压缩包中,你可能会找到使用这三个库解析JSON的示例代码,这对于理解和比较它们的使用方式非常有帮助。通过实践,你可以更好地了解每个库的特点,并根据项目需求选择最合适的工具。

    自己实现一个简单的JSON解析器

    本着探究 JSON 原理的目的,我将会在这DEMO中实现了一个简单的JSON解析器。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话,在看完本DEMO后,不妨自己动手实现一个 JSON 解析器。

    PB Json解析库

    PB Json解析库是一种用于处理协议缓冲区(Protocol Buffers,简称PB)与JSON之间相互转换的工具。在软件开发中,尤其是涉及到数据交换时,PB和JSON都扮演着重要的角色。PB是Google推出的一种高效的数据序列化协议,...

    IOS学习之四种Json解析方法的分析demo

    本文将深入探讨四种常见的JSON解析方法在iOS中的应用,并通过实际的代码示例进行分析。 首先,我们来看第一种解析库:SBJson。SBJson是由Stig Brautaset开发的一个Objective-C库,提供了简单的API来解析和生成JSON...

    Android 安卓 json解析

    在线JSON解析涉及到网络请求,Android提供了`HttpURLConnection`或`OkHttp`等方法。这里以`HttpURLConnection`为例: ```java URL url = new URL("http://example.com/data.json"); HttpURLConnection connection =...

    JSON 解析 示例代码

    总的来说,理解和掌握JSON解析是现代Web开发的基本技能之一。无论你是前端开发者还是后端开发者,都需要能够有效地读取、解析和生成JSON数据。通过学习和实践,你可以熟练地利用JSON这一强大的工具进行数据交换和...

    PB解析json,解析JSON案例,解析jsondemo

    在现代软件开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,易于人阅读和编写,同时也方便机器解析和生成。PB,作为一款强大的客户端应用程序开发工具,需要处理从Web服务获取或向...

    json离线解析工具

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。它基于JavaScript的一个子集,格式简洁清晰,易于人类阅读和编写,同时也易于机器解析和生成。在处理JSON数据...

    C#对多级json解析

    在IT行业中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web服务与客户端之间的数据传输。在C#编程环境中,处理JSON数据是常见的任务,尤其是在需要解析多级嵌套结构时。本篇文章将...

    JSON解析包3种解析jar包下载

    org.json.JSONObject是JSON.org提供的一个简单的Java类,它提供了一种将JSON文本转换为Java对象,以及将Java对象转换为JSON文本的方法。这个库小巧轻便,适用于简单的JSON解析和生成任务。JSONObject类包含了一系列...

    Json解析Gson解析

    本篇文章将深入探讨JSON解析以及Gson库的使用方法。 一、JSON解析基础 JSON是一种独立于语言的数据表示格式,其结构清晰,易于人阅读和编写,同时也容易让机器解析和生成。JSON主要由键值对(key-value pairs)...

    最简单最高效的Json解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间的数据传输。它的设计目标是尽可能地简单、易于读写,并且能够被人类和机器轻易地解析和生成。在本文中,我们将深入探讨...

    ASP解析JSON方法

    另一种方法是使用XMLHTTP对象发起异步请求,从服务器获取JSON数据,然后在客户端使用JavaScript解析。这种方式结合了客户端和服务器端的优势,但同样需要注意数据安全问题。 6. ASP.NET ISAPI Filter 如果你能够...

    易语言页面订单json解析

    易语言是一种中文编程语言,设计目标是使编程更为简单、直观,因此非常适合初学者和非专业程序员使用。通过易语言,我们可以实现以下功能: 1. **初始化表格**:在程序中,初始化表格是一个必要的步骤,用于展示和...

    鬼脸JSON解析小工具forMac

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web服务和应用程序之间的数据传输。在Mac操作系统上,对于开发者来说,快速、直观地解析和查看JSON数据是日常工作中不可或缺的一部分。...

Global site tag (gtag.js) - Google Analytics