一种简单的json解析方法

       在前面的新闻系统设计中,常常会用到有关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字符串的速度.不过对于要求不太高的应用还是足够了.而且页面上的请求都是最基本的请求,完全可以在基础之上进行添加新的功能.以后有想法再在上面作些文章.
相关源码放在附件中,需要的同学们可下来看看.

json解析的三种方式 立即下载

相关推荐

三种json解析方法

json数据格式现在很流行,解析方便,传输速度快,这里举例实现了三种类库解析json:json-lib;Gson;Jackson,非常方便!

JSON三种数据解析方法

引言 JSON数据现在是我们开发中用的最多的,百分之八十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

周将的博客 35万+

jsonutil解析

json解析大全android,java

学习Javascript之JSON篇

JSON是JavaScript的严格子集,利用JavaScript中的几种模式来表示结构的数据。 理解JSON的关键点是把它当作一种数据格式,而不是编程语言。 1、JSON语法支持三种类型的值: 1、简单值:字符串、数值、布尔值和null,特殊值undefined不可以 2、对象:第一种复杂数据类型,对象表示有序键值对。每个值可以是简单值也可以是复杂类型 3、数组:第二种复杂数据类型,数组表示可以通过数值索引访问的值的有序列表,数组的值可以是任意类型,包括简单值、对象、甚至其他数组 注意点:JSON没有变

花椒和蕊的博客 478

使用广播星历进行 GPS 卫星位置的计算

目录1.计算卫星运动的平均角速度 n2.计算观测瞬间卫星的近地点角3.计算偏近点角4.计算真近点角 f5.计算升交角距 6.计算摄动改正项7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置9.计算观测瞬间升交点的经度 L10.计算卫星在瞬时地球坐标系中的位置11.计算卫星在协议地球坐标系中的位置使用广播星历进行GPS卫星位置的计算的详细步骤如下:关于在广播星历中各参数的分布情况可以参考下图:首先根据广播星历中给出的参数 计算参考时刻(TOE) 的平均角速度 式中,GM为万有引力常数 G 与地球总质量

qq_43381998的博客 5569

深入理解C语言内存管理:堆与栈的区别

栈是一种遵循后进先出(LIFO)原则的数据结构。在程序中,栈用于存储局部变量、函数的参数以及函数调用时的返回地址等信息。栈的内存管理由操作系统自动进行,每次函数调用时都会在栈上分配一块内存区域,函数执行完毕后,该内存区域会自动释放。在C语言中,堆与栈是两种不同的内存分配方式,各自有着不同的特点和适用场景。栈内存自动管理,访问速度快,但大小有限,适用于存储局部变量和函数调用信息。堆内存由程序员手动管理,适用于存储动态数据结构,大小不受限制,但访问速度较慢,容易导致内存泄漏等问题。

set_one的博客 1581

Json的三种解析技术

上篇博客讲到怎么去读取本地Json文件,此博客主要深入学习Json 的使用,毕竟,不搞明白这东西,项目没法搞了。稳扎稳打,方能步步为赢。了解Json 的人都知道,Json本质 就是一种具有特定格式的字符串,它的数据结构分为JSON对象和JSON数组。J是首先一种数据结构,说白了就是对数据的描述,刚刚出现是为了取代XML,可惜并没有,但是在作为配置文件上,却是很好,由于它小巧灵活,描述数据很好,所以在网络上进行数据传输更加方便。!!!

qq_58259539的博客 4253

CCS环境下ADC采样波形的实时可视化调试技巧

本文详细介绍了在CCS环境下实现ADC采样波形实时可视化的调试技巧。通过数组缓存优化、多通道同步显示和波形测量工具的高级用法,帮助开发者高效调试嵌入式系统中的ADC采样问题,提升信号分析的准确性和效率。

weixin_33712987的博客 419

JSON.Stringfly()问题

## JSON.Stringfly()问题 const a = { a: undefined, b: null, c: false, d: 3, e: isNaN }; // const b = Object.assign(a); const b = JSON.stringify(a); console.log(b);//{"b":null,"c":false,"d":3}

zhangchangzhangchang的博客 238

电力电子技术进阶:从基础到实战的完整学习路径

本文系统阐述了电力电子技术从基础到实战的完整学习路径。首先解析了电力电子作为“电能魔术师”的核心作用,随后深入剖析了数学工具、电路电磁场与半导体器件三大基础支柱。文章重点讲解了DC-DC、DC-AC、AC-DC等核心变换拓扑,并探讨了从经典PID到现代模型预测控制(MPC)的控制策略。最后,分享了硬件设计、软件调试、电磁兼容(EMC)等实战经验与前沿趋势,为学习者提供了清晰的进阶指南。

weixin_29204205的博客 447

VisionPro 机器视觉案例 之 彩色保险丝个数统计

CogColorSegmenterTool CogColorMatchTool

机器视觉李小白的博客 2353

一种简单的JSON解析方法

  在前面的新闻系统设计中,常常会用到有关ajax的请求,如对文章类别的动态调用.本来struts2提供了一个json的插件,不过在开发的时候还不知道.自己写了一个,还将就吧.      基本原理,就是改变struts2的返回类型,原来的返回类型为string,如果返回类型为void即不返回任何类型,而改由struts2的的ServletContext对象获得用到输出的out对象,将json对象输

一个角落 3437

Ultralytics YOLOv8 英伟达™ Jetson®处理器部署

英伟达™(NVIDIA®)Jetson 是一系列嵌入式计算板卡,旨在为边缘设备带来加速的 AI(人工智能)计算。这些小巧而功能强大的设备围绕英伟达™(NVIDIA®)的GPU架构打造,能够直接在设备上运行复杂的人工智能算法和深度学习模型,而无需依赖云计算资源。Jetson 板卡通常用于机器人、自动驾驶汽车、工业自动化和其他需要在本地以低延迟和高效率执行人工智能推理的应用中。此外,这些板卡基于 ARM64 架构,与传统 GPU 计算设备相比运行功耗更低。英伟达™(NVIDIA®)JetPack SDK。

机器人控制与仿真应用 3876

c#解析json字符串处理(最清晰易懂的方法)

本文是全网第二简单的方法,因为我女票也发了一篇博客说是全网最简单的方法,我不能和她争。。。 PS:网络上还有各种各样的方法大家可以自行探究,不过我敢说肯定没有本文讲的清晰。。几句话就解决的事绕来绕去的说。。 (完整代码在文末,引用库文件后可直接运行~) 需求: 假设有如下json字符串: { "companyID": "15", "employees": [ ...

sajiazaici的博客 13万+

在 SAP S/4HANA 分析模型中添加 Measures,Calculated、Restricted、Currency Conversion 与 Unit Conversion 的建模思路

摘要: SAP S/4HANA分析查询建模中,度量(measure)的加工层级是关键难点,涉及聚合时机、币种/单位语义、过滤上下文等复杂因素。度量不仅是数字字段,还需处理计算口径(Calculated Measures)、上下文绑定(Restricted Measures)和单位转换等问题。Calculated Measures适合派生指标(如毛利率),需注意聚合前后计算差异;Restricted Measures通过固化过滤条件(如区分实际/计划金额)确保业务语义一致性。建模时应将业务逻辑下沉到分析模型层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1023

从零开始做对容量规划:一文讲透 SAP Greenfield sizing 与 Quick Sizer 落地方法

摘要 SAP项目早期硬件规划面临业务细节缺失的挑战,Greenfield sizing方法通过Quick Sizer工具将业务需求转化为硬件资源需求。该方法聚焦主要负载驱动因素而非精确预测,采用标准化问卷形式输入并发用户数、业务处理量等参数,输出内存、CPU等资源需求。关键步骤包括选择正确的Quick Sizer版本、创建sizing项目、参考SAP基准测试和认证目录校准结果,最终将需求交由硬件厂商落地。该方法特别适用于缺乏历史数据的新系统部署,帮助在不确定性中建立可控的容量规划模型,避免资源浪费或性能不足

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

C#: Json数组的 简单解析操作

Json 数组简单解析 操作前言:游戏戏中,有时候会用到 一些数据保存到 json里面,在再需要的时候读取出来。一般是用来保存一些不常修改的文本信息,如游戏中每天固定的任务名与任务描述 数据 (一般是固定的)。下面记录一下自己在实践中,对 json 数组解析的简单操作 实现。// 加载 json 文件 string strPath = "Json/text.json"; ...

JeterPong's Column 3898

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

简单json数据解析-java篇

public calss KV{ private String key; private String value; } public calss KV{private String key;private String value;}

测试 501

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android网络数据解析——JSON

在上面文章中,主要介绍了xml文件的解析,具体内容参见:点击打开链接这篇文章主要介绍JSON中文件的解析方法。JSON文件格式如下:[ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName

Go_AheadY的博客 788

Android解析——json解析为javabean

json的解析,归根结底就是用JsonObject以及JsonArray来实现的。 在日常中,当我们拿到一个较为复杂的json字符串的时候,用以上两个虽然能实现解析,但显得很麻烦。这里介绍下用Gson类来将json解析为javabean。 用两个json字符串来分析: 一、简单json字符串的解析 String JSON_SIMPLE_STRING="{\"sitename\":\"JSO

双斧狂暴战专栏 6311

Android 较复杂JSON的解析过程

因为它一层套一层,并且出现了JSONArray里面的子JSONObject又嵌套了JSONArray的情况,那么接下来别虚,跟随我的脚步一起来征服它,彻底的理解原生解析过程。

u012874222的博客 2313

解析json的两个方法

json解析: 1.eval方法:eval('('+data+')');,这种方法很不安全,会执行Json里的方法,容易导致window.location到另外的代码; 2.json.parse:安全

zhulin1993的专栏 359

VC解析JSON格式数据

近日使用VC编写互联网

QQ2086819057的专栏 1178

vb6里解析json数据

vb6里不支持json对象,这里使用通过引用js来实现json的解析 获取简单的json串里的值 遍历json键值对较多的复杂json串

shepherd_dirk的博客 1万+

用安卓自带的原生方法解析从webservice获取的json数据

解析服务器端Json数据成对象组

huangxulei的专栏 1713
上一篇: 新闻发布系统设计思路(Action)
下一篇: 对speedframework框架的修改和运用
Fly_m
博客等级 码龄20年 40粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值