- 浏览: 5179181 次
- 性别:
- 来自: 天津
-
博客专栏
-
-
实战 Groovy
浏览量:29483
文章分类
- 全部博客 (639)
- 代码之谜 (6)
- JavaScript quirks (5)
- 程序员 (92)
- Java (93)
- BT编程 (7)
- html/css (64)
- Groovy&Grails (42)
- Android (20)
- C/C++ (5)
- PHP/Perl/Python (46)
- 经典文章 (51)
- CodeIgniter (14)
- JQuery (10)
- 笑话 (4)
- 其他 (32)
- javascript (69)
- 云计算 (0)
- html5 (7)
- 面试 (8)
- google (3)
- nosql (2)
- nodejs (11)
- go (5)
- erlang (1)
- 小常识 (3)
- 冷知识 (5)
- database (4)
- web (12)
- 架构 (12)
- Exception (0)
最新评论
-
jqw1992:
https://www.chromefor.com/libra ...
[福利] 开发者必备的 Chrome 插件——ChromeSnifferPlus -
litjerk:
初步算了一下,目前最最精简的Win98版是5M,他5个小时多敲 ...
让人目瞪口呆的三位世界级电脑大师 -
379855529:
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的 ...
Java NIO与IO的详细区别(通俗篇) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
一步步开发 Spring MVC 应用 -
匡建武:
Good
四个程序员的一天
概述
如今大量的 Web 站点应用了 AJAX 技术,通过更少的数据通讯,服务器能够更快的反馈用户请求,再通过 Javascript 的控制,让使用者有了更好的用户体验。 JSON 是一种轻量级的数据交换语言,它是 Javascript 的一个子集,又有良好的可读性,经常用于客户端和服务器间的数据交换。因此,在服务器端,常常需要将实体对象( JavaBean )转换为 JSON 格式数据。本文介绍了如何使用 Json-lib 转换 JavaBean 为 JSON 格式数据,并给出解决方法,以及利用 annotation 来增强 Json-lib 的两个功能:一是灵活的筛选 JavaBean 属性;二是通过 JsonValueProcessor 来自定义如何转换 JavaBean 属性到 JSON 数据。
JSON 数据格式
JSON 的数据格式简单易读,它存在于两种基本形式:
· 名值对(Collection ):名称与值用 ‘ : ’ 分开;名值对之间用 ‘ , ’ 分隔;整体用 ‘ {} '括起来。例如 {name1:value1, name2:value2}
· 值的有序队列(Array ):即数组,每个值之间用 ‘ , ’ 分隔;整体用 ‘ [] '括起来。例如: [value1, value2]
这两种形式的有机组合,就形成了 JSON 数据。
使用 Json-lib 转换 JavaBean 为 JSON 数据
Json-lib 是一个 java 工具库,它提供 api 来转换 JavaBean , Map , Collection 等对象为 JSON 数据,或反过来通过 JSON 数据得到 JavaBean 。
Json-lib 的使用很容易,只要使用 JSONSerializer 的 toJSON 方法就可以转换任意的 Java Object 为 JSON 对象了,再调用 JSON 对象的 toString 方法可以得到转换后的字符串。不过还有一些进一步的问题需要我们自己来解决。
import net.sf.json.JSONSerializer;
List list = new ArrayList(); list.add( "first" ); list.add( "second" ); JSON json = JSONSerializer.toJSON( list ); System.out.println( json.toString() ); // prints ["first","second"]
class MyBean{ private String name = "json"; private int pojoId = 1;
// getters & setters ... } json = JSONSerializer.toJSON( new MyBean() ); System.out.println( json.toString() ); // prints {"name":"json","pojoId":1}
|
清单 1 中的例子转换后的 JSON 数据中包含了 JavaBean 中的全部属性,可是我们常常需要有选择的提取 JavaBean 中的特定属性出来。例如:
· 需要过滤掉循环引用的属性,这一点 json-lib 提供了 CycleDetectionStrategy 来处理,但是直接过滤掉更简单;
· 不同的情况下只需要 JavaBean 中的部分属性:比如列表界面只需要显示 Bean 的几个重要属性,而详情界面则需要显示更多的 Bean 的属性;
· 不同的用户权限限制用户只能获得某些属性数据;
对于普通的 Object 类型(如 Long , String 等), json-lib 有缺省的值转换处理方式,但是对于一些特殊的类型,我们希望用自定义的方式来转换该属性的值。例如:
· 对于 java.util.Date 类型,我们希望直接转换成时间串: 2010-04-10 ,而不希望得到一个类似 {"year":"2010","month":"4","day":"10"} 这样的结果
· 对于常用到的代码数据(比如:性别),在定义时它也许是个 Integer (男: 1 ;女: 2 ),我们希望在转换后直接得到: {" 性别 ":" 男 ",...} ,而不是 {" 性别 ":"1",...}
Json-lib 已经预留出一些接口,让用户修改它的缺省行为。下面我们来看看如何利用 annotation 来配合 Json-lib 解决这两个问题。
使用 annotation 筛选 JavaBean 属性
JSONSerializer 提供了一个 toJSON 的重载方法,增加一个参数 JsonConfig ,可以通过这个参数对 Json-lib 的缺省方式做自定义的配置。
清单 2.
自定义
JSONSerializer
的属性过滤器
import net.sf.json.JSONSerializer; import net.sf.json.JsonConfig; import net.sf.json.util.PropertyFilter; // 定义属性过滤器 PropertyFilter filter = new PropertyFilter( public boolean apply(Object source, String name, Object value) { if ( name.equals( “pojoId” ) ) { return true; // 返回 true, 表示这个属性将被过滤掉 } return false; } ); // 注册属性过滤器 JsonConfig config = new JsonConfig(); config.setJsonPropertyFilter( filter );
System.out.println( JSONSerializer.toJSON( new MyBean(), config ) ); // prints {"name":"json"}
|
从清单 2 中可以看出来, Json-lib 通过 PropertyFilter 的 apply 方法进行属性过滤,可以象例子中一样,把所有需要过滤的属性名称写进去,但是这样做太烦琐,也不好维护,对不同的 Bean 要做不同的处理。下面让我们看看怎么利用 annotation 来更方便的处理。
首先,需要定义一个 annotation ,并给 MyBean 的 get 方法加上标注。
清单 3.
定义一个
annotation: Invisible
import java.lang.annotation.Target; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.ElementType; import java.lang.annotation.RetentionPolicy;
@Documented @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Invisible { public String[] value(); }
// 为 myBean 中需要过滤的属性 get 方法(或者 is 方法)加上 Invisible 标注 public class MyBean{ private String name = "json"; private int pojoId = 1;
// getters & setters public String getName() { return name; } @Invisible(“LIST”) // 在 “LIST” 情况下不要这个属性 public int getPojoId() { return pojoId; } }
|
然后,我们需要一些能处理 annotation 的 PropertyFilter 类。
清单 4.
处理
annotation
的
PropertyFilter
类
import java.util.Map; import java.lang.reflect.Method; import net.sf.json.util.PropertyFilter; // 先实现一个 abstract 类,将读取 Bean 属性的 Method 找到并传递给子类处理 public abstract class AbstractMethodFilter implements PropertyFilter { // 这个方法留给子类实现,以便适应不同的过滤需求 public abstract boolean apply(final Method method);
public boolean apply(final Object source, final String name, final Object value) { if (source instanceof Map) { return false; } String propName = name.substring(0, 1).toUpperCase() + name.substring(1); Class clz = source.getClass(); String methodName = "get" + propName; Method method = null; try { method = clz.getMethod(methodName, (Class[]) null); // 寻找属性的 get 方法 } catch (NoSuchMethodException nsme) { String methodName2 = "is" + propName; // 也许是个 is 方法 try { method = clz.getMethod(methodName2, (Class[]) null); } catch (NoSuchMethodException ne) { // 没有找到属性的 get 或者 is 方法,打印错误,返回 true System.err.println(“No such methods: ” + methodName + “ or “ + methodName2); return true; } } return apply(method); } } // END: AbstractMethodFilter
public class InvisibleFilter extends AbstractMethodFilter { // 过滤条件,标注中有符合这个条件的 property 将被过滤掉 private String _sGUIID; public InvisibleFilter(final String guiid) { _sGUIID = guiid; }
public boolean apply(final Method method) { if (_sGUIID == null || _sGUIID.equals(“”)) { return false; // 表示不做限制 } if (method.isAnnotationPresent(Invisible.class)) { Invisible anno = method.getAnnotation(Invisible.class); String[] value = anno.value(); for (int i = 0; i < value.length; i++) { if (_sGUIID.equals(value[i])) { return true; } } } return false; } }
|
现在只要把这个 filter 注册到 JsonConfig 中,就实现了属性的过滤,请看清单 5 。
清单 5.
使用
InvisibleFilter
来过滤不需要的属性
JsonConfig config = new JsonConfig(); config.setJsonPropertyFilter( new InvisibleFilter(“LIST”)); //标注了 LIST 的属性将被过滤掉
System.out.println( JSONSerializer.toJSON( new MyBean(), config ) ); // prints {"name":"json"}
|
增加其他的 annotation 及 Filter 就可以实现不同的属性过滤方式了。
使用 annotation 自定义 Bean 属性的转换方式
Json-lib 通过 JsonConfig 提供了自定义属性转换方式的接口。
注册后 Json-lib 在遇到 java.uitl.Date 类型的属性时,会应用 JsDateJsonValueProcessor 的处理方法。
所以,只要实现自己的 JsonValueProcessor 就可以自定义各种 Object 的转换方式了。
根据上一节的讨论,Json-lib 在转换 Bean 属性之前,会将属性数据传递给 PropertyFilter 来判断是否需要过滤掉。因此,我们可以通过一个 Filter 对象获得 Bean 的属性的标注数据,并将它传递给特定的 Processor , Processor 根据得到的标注值知道应该怎么处理这个属性。下面以整型代码为例,说明处理的方法。
一般情况下,一个项目中会涉及许多种不同的代码,我们会为每一种代码定义一个主代码号(代码往往都是整型的),为它的子项定义几个子代码号。 例如,我们定义性别的主代码号为 100 ,并定义男: 1 ,女: 2 。
首先,需要一个代码标注(IntegerCode )及一个处理这种标注的 PropertyFilter 。
清单 7. IntegerCode
及
IntegerCodeFilter
JsonConfig config = new JsonConfig(); config.registerJsonValueProcessor(java.util.Date.class, new JsDateJsonValueProcessor());
|
@Documented @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface IntegerCode {
|
发表评论
-
Lo-Dash 与 underscore,Prototype 与 jQuery,两段恩怨情仇
2015-12-15 09:35 1732这几天更新我的之前写的 Chrome 插件 ChromeSn ... -
开发者必备的 Chrome 扩展
2014-11-03 15:01 2039Firebug:不用多介绍了吧https://chrome. ... -
开发者福利!ChromeSnifferPlus 插件正式登陆 Chrome Web Store
2014-10-30 21:14 106640今天(2014-10-30)下午,ChromeSniffer ... -
Firebase 相关文章索引
2014-10-23 10:21 2275Awesome Firebase 最近谷歌收购Fireb ... -
JSON API:用 JSON 构建 API 的标准指南中文版
2014-10-14 08:26 19873译文地址:https://github. ... -
前端开发,从菜鸟到大牛的取经之路
2014-07-14 15:15 378888以我的经验,大部分技术,熟读下列四类书籍即可。 入门, ... -
JavaScript Puzzlers 解密(一):为什么 ["1", "2", "3"].map(parseInt) 返回 [1, NaN, NaN]?
2014-02-19 10:58 40552JavaScript Puzzlers! 被称为 javas ... -
JavaScript 的怪癖 4:未知变量名创建全局变量
2013-12-02 15:25 1391原文:JavaScript quirk 4: unknown ... -
JavaScript 的怪癖 5:参数的处理
2013-12-02 15:23 3244原文:JavaScript quirk 5: parame ... -
【ghost初级教程】 怎么搭建一个免费的ghost博客
2013-10-28 14:10 6218ghost博客系统无疑是这个月最火热的话题之一,这个号称” ... -
10 个你需要了解的最佳 javascript 开发实践
2013-10-16 13:54 3606Javascript 的很多扩展的特性是的它变得更加的犀利 ... -
基于 canvas 将图片转化成字符画
2013-09-26 15:05 6590猛点 这里 看高清 ... -
详解一下 javascript 中的比较
2013-09-22 09:30 1926代码1: [] == []; // false ... -
谈 javascript 变量声明
2013-06-14 10:35 1899这篇文章还是对基础的复习,对面试经历的一个总结。 之前的 ... -
[译]Javascript 作用域和变量提升
2013-06-13 13:16 5215下面的程序是什么结果? var fo ... -
javascript:可以运行的噪音
2013-06-01 09:34 9303为我的博客做了一个很有 geek 风格的关于页面。运行下面 ... -
【layoutit!】基于 bootstrap 实现可视化布局工具
2013-05-20 11:23 14636Layout It 是一个在线工具,它可以简单而又快速搭建 ... -
回复:浮点数0.57 0.58 造出的坑爹问题
2013-05-09 11:30 25183今天看到 vb2005xu 提到了一个问题 浮点数0.5 ... -
javascript 中强制执行 toString()
2013-04-26 13:25 1550原文:Enforcing toString() 译文:ja ... -
JavaScript 中的“自动分号插入”机制(ASI)
2013-04-24 08:41 8447原文:Automatic semicolon insert ...
相关推荐
<package name="annotation" namespace="/" extends="json-default"> <result name="success">/json/user.json ``` - **测试**: 同前,但使用注解的方式指定要序列化的字段名。 #### 8. 参数说明 - **XML...
7. **Java Annotation**:Struts 2支持使用注解进行配置,使得代码更简洁,配置更直观。 8. **Spring Framework**:虽然不是必须的,但很多项目会将Struts 2与Spring框架集成,实现依赖注入和事务管理。 9. **...
vue3 访问通义千问聊天代码例子
基于Python的Flask-vue基于Hadoop的智慧校园数据共享平台实现源码-演示视频 项目关键技术 开发工具:Pycharm 编程语言: python 数据库: MySQL5.7+ 后端技术:Flask 前端技术:HTML 关键技术:HTML、MYSQL、Python 数据库工具:Navicat、SQLyog
【实验1】:读取一次AI0通道数值 【实验2】:一次读取AI0通道多个数值 【实验3】:单次模拟量输出 【实验4】:连续模拟量输出(输出一个正弦曲线)
无人船的Smith-PID跟踪控制方法研究及实现:融合传统与最优PID策略的LOS曲线跟踪资料,基于无人船Smith-PID改进跟踪控制技术及其LOS曲线跟踪方法研究资料,基于无人船的smith-pid跟踪控制资料。 首先,针对pid进行了改进,有传统pid,最优pid和基于smith的pid三种控制方式。 然后还在smithpid基础上设计了LOS的曲线跟踪方法。 (有对应参考文献)。 有意者可直接联系,参考学习资料。 python语言。 ,基于无人船的Smith-PID跟踪控制; PID改进(传统PID、最优PID、基于Smith的PID); Smith-PID曲线跟踪方法; 参考学习资料; Python语言。,基于无人船的Smith-PID优化跟踪控制资料
自研船舶电力推进系统MATLAB仿真报告:从柴油机+同步发电机到异步电机直接转矩控制的全面模拟与实践,《船舶电力推进系统自搭MATLAB仿真报告:从柴油机同步发电机到异步电机直接转矩控制的完整过程与参数配置详解》,自己搭建的船舶电力推进系统(船舶电力推进自动控制)完全自搭MATLAB仿真,可适度,含对应27页正文的中文报告,稀缺资源,仿真包括船舶电站,变流系统和异步电机直接转矩控制,放心用吧。 三个文件逐层递进 柴油机+同步发电机(船舶电站) 柴油机+同步发电机+不控整流全桥逆变 柴油机+同步发电机+变流模块+异步电机直接转矩控制 所有参数都是配好的,最大负载参考变流系统所带负载两倍,再大柴油机和同步发电机参数就不匹配了,有能力可以自己调 ,核心关键词:船舶电力推进系统; MATLAB仿真; 船舶电站; 变流系统; 异步电机直接转矩控制; 柴油机; 同步发电机; 不控整流全桥逆变; 参数配比。,《船舶电力推进系统MATLAB仿真报告》
西门子博图WinCC V15自动化系统项目实战:多服务器客户端下的PID DCS闭环控制及参数调整实战指南,西门子博图WinCC V15自动化系统项目实战:多服务器客户端下的PID DCS闭环控制及参数调整实战指南,西门子博图WinCC V 15大型自动化系统项目,包含多台服务器客户端项目,系统采用安全1516F -3PN DP 外挂多台精智面板,1200PLC ET200SP 变频器 对整个工艺过程PID DCS 闭环过程控制,如何调整温度压力流量液位等参数,实用工程项目案例 ,西门子博图WinCC V 15; 大型自动化系统; 多台服务器客户端; 安全外挂; 精智面板; 1200PLC ET200SP; 变频器; PID DCS; 闭环过程控制; 温度压力流量液位调整; 工程项目案例,西门子博图WinCC V15大型项目:多服务器客户端的PID DCS闭环控制与实用参数调整
内容概要:本文详尽介绍了计算机网络相关资源及其各方面构成要素,首先阐述了硬件层面的各种传输媒介和设备如双绞线、同轴电缆、光纤以及台式电脑、笔记本、大型计算机等设备,还包括网络互联所需的各类组件如网卡、交换机、路由器等。其次探讨了多种操作系统的特性和主要功能,以及各类通讯和支持应用程序的概述,涵盖浏览器、图像和视频编辑等常用软件。再深入讨论了多种常见网络协议如TCP、UDP、HTTP等的功能特性。最后还提到了确保网络安全运行的重要措施和工具如MIB、SNMP以及防火墙、入侵检测系统等。并且简要提到计算机网络在不同的应用环境,从局域网到移动网络。 适合人群:所有对计算机网络技术感兴趣的初学者和希望深入了解各个组成成分的技术人员. 使用场景及目标:为用户提供计算机网络资源全面而系统的认识,帮助他们建立对于该领域的理论和技术的扎实认知基础,提高在实际环境中识别配置及维护计算机网络系统的能力.
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
ABAQUS中隧道结构模型的无限元应用:超声激励源的施加方法、3D无限元吸收边界的添加技巧、模型结果精确性校核流程及教学视频与CAE、INP文件解析,ABAQUS隧道模型中3D无限元吸收边界的应用:超声激励源的施加与模型结果精确性校核的实践教程,ABAQUS无限元吸收边界,abaqus隧道无限元,1.超声激励源施加;2.3D无限元吸收边界添加方法;3.模型结果精确性校核;4.提供教学视频,cae、inp文件。 ,ABAQUS无限元吸收边界;ABAQUS隧道无限元;超声激励源施加;3D无限元吸收边界添加;模型结果精确性校核;CAE和INP文件。,ABAQUS中超声激励下无限元吸收边界设置及模型精度验证教程
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
git自用lllllllllllllllllll
本资源与文章【Django小白项目】为一体,此为已成功项目,供给给Django初学者做参考,有不会的问题可以私信我噢~
使用一维数据表示向量和二维矩阵,支持常用运算。
1、以上文章可用于参考,请勿直接抄袭,学习、当作参考文献可以,主张借鉴学习 2、资源本身不含 对应项目代码,如需完整项目源码,请私信博主获取
基于多目标粒子群优化算法(MOPSO)的微电网多目标经济运行分析与优化策略考虑响应侧响应的协同调度策略,基于多目标粒子群优化算法(MOPSO)的微电网经济调度优化:含风光储荷一体化模型与需求侧响应策略,考虑需求侧响应的微电网多目标经济运行 建立了含风光储荷的微电网模型,以发电侧成本(包括风光储以及电网的购电成本)和负荷侧成本最小为目标,考虑功率平衡以及储能SOC约束,建立了多目标优化模型,通过分时电价引导负荷需求侧响应,得到可削减负荷量,同时求解模型,得到风光储以及电网的运行计划。 这段代码是一个使用多目标粒子群优化算法(MOPSO)解决问题的程序。下面我将对程序进行详细的分析和解释。 首先,程序的目标是通过优化算法来解决一个多目标优化问题。程序中使用的优化算法是多目标粒子群优化算法(MOPSO),该算法通过迭代更新粒子的位置和速度来搜索最优解。 程序的主要功能是对能源系统进行优化调度,包括光伏发电、风力发电、储能和电网供电。程序的目标是最小化能源系统的成本,并满足负荷需求。 程序的主要思路是使用粒子群优化算法来搜索最优解。程序中定义了一个粒子类(Particle),每个粒子代
data.gov.sg geojson部分项目整理
基于MATLAB Simulink的避障功能欠驱动无人船航迹跟踪控制仿真实验研究,基于MATLAB Simulink的欠驱动无人船避障功能路径跟踪控制仿真实验研究,包含避障功能的欠驱动无人船航迹(路径)跟踪控制仿真实验,基于MATLAB Simulink制作 ,避障功能; 欠驱动无人船; 航迹(路径)跟踪控制; MATLAB Simulink 仿真实验; 避障算法。,基于MATLAB Simulink的避障无人船航迹跟踪控制仿真实验