- 浏览: 57313 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (75)
- 前端 (1)
- apache (1)
- tomcat (1)
- mybatis (1)
- Spring (4)
- webservice (1)
- xml (1)
- js (1)
- maven (1)
- java缓存技术 (1)
- mysql优化 (1)
- java设计模式 (1)
- redis (9)
- axure (2)
- shell (7)
- extjs (2)
- Logger日志 (2)
- java反射 (1)
- jquery详解 (4)
- jms解析 (1)
- jsp详解 (1)
- linux基础 (5)
- hibernate基础 (3)
- java基础知识 (3)
- Meclipse工具解析 (1)
- json解析 (2)
- 工作流 (1)
- Dom解析 (1)
- HTTP解析 (3)
- Jersey详解 (1)
- 网络爬虫与数据解析 (1)
- EasyUI技术 (1)
- HTML5系列 (2)
- HTML与CSS (5)
- CSS3 (0)
- linux (0)
- keepalived主备切换 (1)
- 同步 (1)
- oracle基础 (0)
- JVM内存 (0)
一,定义
JSON 数据格式
JSON 的数据格式简单易读,它存在于两种基本形式:
名值对(Collection):名称与值用‘:’分开;名值对之间用‘,’分隔;整体用‘ {} '括起来。例如 {name1:value1, name2:value2}
值的有序队列(Array):即数组,每个值之间用‘,’分隔;整体用‘ [] '括起来。例如:[value1, value2]
这两种形式的有机组合,就形成了 JSON 数据。
二 ,json-lib下的json使用技巧
用 annotation 辅助 Json-lib 转换 JavaBean
本文介绍使用 Json-lib 将 JavaBean 转换为 JSON 数据的方法。我们将使用 annotation 来灵巧地筛选 JavaBean 中的属性,并通过 annotation 来定义特殊的 JsonValueProcessor。
概述
如今大量的 Web 站点应用了 AJAX 技术,通过更少的数据通讯,服务器能够更快的反馈用户请求,再通过 Javascript 的控制,让使用者有了更好的用户体验。JSON 是一种轻量级的数据交换语言,它是 Javascript 的一个子集,又有良好的可读性,经常用于客户端和服务器间的数据交换。因此,在服务器端,常常需要将实体对象(JavaBean)转换为 JSON 格式数据。本文介绍了如何使用 Json-lib 转换 JavaBean 为 JSON 格式数据,并给出解决方法,以及利用 annotation 来增强 Json-lib 的两个功能:一是灵活的筛选 JavaBean 属性;二是通过 JsonValueProcessor 来自定义如何转换 JavaBean 属性到 JSON 数据。
使用 Json-lib 转换 JavaBean 为 JSON 数据
Json-lib 是一个 java 工具库,它提供 api 来转换 JavaBean,Map,Collection 等对象为 JSON 数据,或反过来通过 JSON 数据得到 JavaBean。
Json-lib 的使用很容易,只要使用 JSONSerializer 的 toJSON 方法就可以转换任意的 Java Object 为 JSON 对象了,再调用 JSON 对象的 toString 方法可以得到转换后的字符串。不过还有一些进一步的问题需要我们自己来解决。
清单 1. 使用 JSONSerializer
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: 需要有选择的提取 JavaBean 中的属性
清单 1 中的例子转换后的 JSON 数据中包含了 JavaBean 中的全部属性,可是我们常常需要有选择的提取 JavaBean 中的特定属性出来。例如:
需要过滤掉循环引用的属性,这一点 json-lib 提供了 CycleDetectionStrategy 来处理,但是直接过滤掉更简单;
不同的情况下只需要 JavaBean 中的部分属性:比如列表界面只需要显示 Bean 的几个重要属性,而详情界面则需要显示更多的 Bean 的属性;
不同的用户权限限制用户只能获得某些属性数据;
问题 2: 需要自定义某些属性的转换方式
对于普通的 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 提供了自定义属性转换方式的接口。
清单 6. 注册 JsonValueProcessor
JsonConfig config = new JsonConfig();
config.registerJsonValueProcessor(java.util.Date.class, new JsDateJsonValueProcessor());
注册后 Json-lib 在遇到 java.uitl.Date 类型的属性时,会应用 JsDateJsonValueProcessor 的处理方法。
所以,只要实现自己的 JsonValueProcessor 就可以自定义各种 Object 的转换方式了。
根据上一节的讨论,Json-lib 在转换 Bean 属性之前,会将属性数据传递给 PropertyFilter 来判断是否需要过滤掉。因此,我们可以通过一个 Filter 对象获得 Bean 的属性的标注数据,并将它传递给特定的 Processor,Processor 根据得到的标注值知道应该怎么处理这个属性。下面以整型代码为例,说明处理的方法。
一般情况下,一个项目中会涉及许多种不同的代码,我们会为每一种代码定义一个主代码号(代码往往都是整型的),为它的子项定义几个子代码号。例如,我们定义性别的主代码号为 100,并定义男:1,女:2。
首先,需要一个代码标注(IntegerCode)及一个处理这种标注的 PropertyFilter。
清单 7. IntegerCode 及 IntegerCodeFilter
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IntegerCode {
public int value();
}
public class IntegerCodeFilter extends AbstractMethodFilter {
// 代码处理器
private IntegerCodeProcessor _processor;
public IntegerCodeFilter(final IntegerCodeProcessor processor) {
_processor = processor;
}
// 不过滤属性,但当发现IntegerCode标注时,将数据传递给Processor
public boolean apply(final Method method) {
if (_processor == null) {
return false; // 表示没有特别的处理
}
if (method.isAnnotationPresent(IntegerCode.class)) {
IntegerCode anno = method.getAnnotation(IntegerCode.class);
int code = anno.value();
_processor.setMainCode(code); // 将code设置为主代码
}
return false;
}
}
现在,我们需要一个 JsonValueProcessor 来处理 IntegerCode 数据。
清单 8. IntegerCodeProcessor
public class IntegerCodeProcessor implements JsonValueProcessor {
private int _iMainCode;
public void setMainCode(final int mainCode) { _iMainCode = mainCode; }
public IntegerCodeProcessor() {
super();
} // END: IntegerCodeProcessor
private void reset() {
_iMainCode = -1;
}
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value, jsonConfig);
} // END: processArrayValue
public Object processObjectValue(
String key, Object value, JsonConfig jsonConfig ) {
return process( value, jsonConfig );
} // END: processObjectValue
private Object process(Object value, JsonConfig jsonConfig) {
if (value == null) {
return null;
}
String ret = null;
if (value instanceof Integer && _iMainCode >= 0) {
int code = value.intValue();
switch (_iMainCode) {
case 100: // 这里使用简单的case 处理不同的代码
if (code == 1) { // 好一点的方式是从资源文件中读取对应值
ret = "man";
} else if (code == 2) {
ret = "woman";
} else {
ret = value.toString();
}
break;
default:
ret = value.toString();
break;
}
} else {
ret = value.toString();
}
reset(); // 处理后重置,以免影响其他 Integer 属性
return ret;
} // END: process
}
现在,我们创建一个 JavaBean:Student 来测试这个 Processor。
清单 9. 测试 IntegerCodeProcessor
public class Student {
private String name = "camry";
private int gender = 1;
// getters & setters
public String getName() { return name; }
@IntegerCode(100) // 性别主代码为 100
public int getGender() { return gender; }}
}
...
IntegerCodeProcessor processor = new IntegerCodeProcessor();
IntegerCodeFilter filter = new IntegerCodeFilter(processor);
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter( filter );
config.registerJsonValueProcessor(Integer.class, processor);
System.out.println( JSONSerializer.toJSON( new Student(), config ) );
// prints {“gender”:”man”, "name":"camry"}
Json-lib 可以很方便的进行 JavaBean 到 JSON 数据的转换,再结合 annotation 为 JavaBean 的属性定义元数据,可以减少代码,提高效率.
JSON 数据格式
JSON 的数据格式简单易读,它存在于两种基本形式:
名值对(Collection):名称与值用‘:’分开;名值对之间用‘,’分隔;整体用‘ {} '括起来。例如 {name1:value1, name2:value2}
值的有序队列(Array):即数组,每个值之间用‘,’分隔;整体用‘ [] '括起来。例如:[value1, value2]
这两种形式的有机组合,就形成了 JSON 数据。
二 ,json-lib下的json使用技巧
用 annotation 辅助 Json-lib 转换 JavaBean
本文介绍使用 Json-lib 将 JavaBean 转换为 JSON 数据的方法。我们将使用 annotation 来灵巧地筛选 JavaBean 中的属性,并通过 annotation 来定义特殊的 JsonValueProcessor。
概述
如今大量的 Web 站点应用了 AJAX 技术,通过更少的数据通讯,服务器能够更快的反馈用户请求,再通过 Javascript 的控制,让使用者有了更好的用户体验。JSON 是一种轻量级的数据交换语言,它是 Javascript 的一个子集,又有良好的可读性,经常用于客户端和服务器间的数据交换。因此,在服务器端,常常需要将实体对象(JavaBean)转换为 JSON 格式数据。本文介绍了如何使用 Json-lib 转换 JavaBean 为 JSON 格式数据,并给出解决方法,以及利用 annotation 来增强 Json-lib 的两个功能:一是灵活的筛选 JavaBean 属性;二是通过 JsonValueProcessor 来自定义如何转换 JavaBean 属性到 JSON 数据。
使用 Json-lib 转换 JavaBean 为 JSON 数据
Json-lib 是一个 java 工具库,它提供 api 来转换 JavaBean,Map,Collection 等对象为 JSON 数据,或反过来通过 JSON 数据得到 JavaBean。
Json-lib 的使用很容易,只要使用 JSONSerializer 的 toJSON 方法就可以转换任意的 Java Object 为 JSON 对象了,再调用 JSON 对象的 toString 方法可以得到转换后的字符串。不过还有一些进一步的问题需要我们自己来解决。
清单 1. 使用 JSONSerializer
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: 需要有选择的提取 JavaBean 中的属性
清单 1 中的例子转换后的 JSON 数据中包含了 JavaBean 中的全部属性,可是我们常常需要有选择的提取 JavaBean 中的特定属性出来。例如:
需要过滤掉循环引用的属性,这一点 json-lib 提供了 CycleDetectionStrategy 来处理,但是直接过滤掉更简单;
不同的情况下只需要 JavaBean 中的部分属性:比如列表界面只需要显示 Bean 的几个重要属性,而详情界面则需要显示更多的 Bean 的属性;
不同的用户权限限制用户只能获得某些属性数据;
问题 2: 需要自定义某些属性的转换方式
对于普通的 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 提供了自定义属性转换方式的接口。
清单 6. 注册 JsonValueProcessor
JsonConfig config = new JsonConfig();
config.registerJsonValueProcessor(java.util.Date.class, new JsDateJsonValueProcessor());
注册后 Json-lib 在遇到 java.uitl.Date 类型的属性时,会应用 JsDateJsonValueProcessor 的处理方法。
所以,只要实现自己的 JsonValueProcessor 就可以自定义各种 Object 的转换方式了。
根据上一节的讨论,Json-lib 在转换 Bean 属性之前,会将属性数据传递给 PropertyFilter 来判断是否需要过滤掉。因此,我们可以通过一个 Filter 对象获得 Bean 的属性的标注数据,并将它传递给特定的 Processor,Processor 根据得到的标注值知道应该怎么处理这个属性。下面以整型代码为例,说明处理的方法。
一般情况下,一个项目中会涉及许多种不同的代码,我们会为每一种代码定义一个主代码号(代码往往都是整型的),为它的子项定义几个子代码号。例如,我们定义性别的主代码号为 100,并定义男:1,女:2。
首先,需要一个代码标注(IntegerCode)及一个处理这种标注的 PropertyFilter。
清单 7. IntegerCode 及 IntegerCodeFilter
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IntegerCode {
public int value();
}
public class IntegerCodeFilter extends AbstractMethodFilter {
// 代码处理器
private IntegerCodeProcessor _processor;
public IntegerCodeFilter(final IntegerCodeProcessor processor) {
_processor = processor;
}
// 不过滤属性,但当发现IntegerCode标注时,将数据传递给Processor
public boolean apply(final Method method) {
if (_processor == null) {
return false; // 表示没有特别的处理
}
if (method.isAnnotationPresent(IntegerCode.class)) {
IntegerCode anno = method.getAnnotation(IntegerCode.class);
int code = anno.value();
_processor.setMainCode(code); // 将code设置为主代码
}
return false;
}
}
现在,我们需要一个 JsonValueProcessor 来处理 IntegerCode 数据。
清单 8. IntegerCodeProcessor
public class IntegerCodeProcessor implements JsonValueProcessor {
private int _iMainCode;
public void setMainCode(final int mainCode) { _iMainCode = mainCode; }
public IntegerCodeProcessor() {
super();
} // END: IntegerCodeProcessor
private void reset() {
_iMainCode = -1;
}
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value, jsonConfig);
} // END: processArrayValue
public Object processObjectValue(
String key, Object value, JsonConfig jsonConfig ) {
return process( value, jsonConfig );
} // END: processObjectValue
private Object process(Object value, JsonConfig jsonConfig) {
if (value == null) {
return null;
}
String ret = null;
if (value instanceof Integer && _iMainCode >= 0) {
int code = value.intValue();
switch (_iMainCode) {
case 100: // 这里使用简单的case 处理不同的代码
if (code == 1) { // 好一点的方式是从资源文件中读取对应值
ret = "man";
} else if (code == 2) {
ret = "woman";
} else {
ret = value.toString();
}
break;
default:
ret = value.toString();
break;
}
} else {
ret = value.toString();
}
reset(); // 处理后重置,以免影响其他 Integer 属性
return ret;
} // END: process
}
现在,我们创建一个 JavaBean:Student 来测试这个 Processor。
清单 9. 测试 IntegerCodeProcessor
public class Student {
private String name = "camry";
private int gender = 1;
// getters & setters
public String getName() { return name; }
@IntegerCode(100) // 性别主代码为 100
public int getGender() { return gender; }}
}
...
IntegerCodeProcessor processor = new IntegerCodeProcessor();
IntegerCodeFilter filter = new IntegerCodeFilter(processor);
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter( filter );
config.registerJsonValueProcessor(Integer.class, processor);
System.out.println( JSONSerializer.toJSON( new Student(), config ) );
// prints {“gender”:”man”, "name":"camry"}
Json-lib 可以很方便的进行 JavaBean 到 JSON 数据的转换,再结合 annotation 为 JavaBean 的属性定义元数据,可以减少代码,提高效率.
相关推荐
《jQuery-JSON使用详解》 在Web开发中,数据交换是不可或缺的一部分,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读性而被广泛应用。jQuery库提供了一套方便的API来处理JSON...
例如,在 Web 开发中,我们可以使用 Json 数据处理技巧来处理服务器端返回的数据,在移动应用中,我们可以使用 Json 数据处理技巧来处理本地存储的数据。 Json 数据处理技巧是指对 Json 数据进行处理和操作的技术和...
如果希望索引数组被编码为JSON对象,可以使用`(object)`转换或`JSON_FORCE_OBJECT`选项。 3. 类(Class)的转换: 当尝试将一个PHP类的对象编码为JSON时,只有公共属性会被编码。常量、私有属性、受保护属性和...
例如,要从 `{"k": "foo", "v": 1.0}` 这个JSON对象中获取 "k" 的值,可以使用 `select get_json_object('{"k": "foo", "v": 1.0}', '$.k') as k`。然而,这种方法对于提取多个字段并不理想,因为每个字段都需要单独...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间的数据...通过实践和调试这些代码,你将能够掌握Delphi与JSON交互的关键技巧,这对于任何Delphi开发者来说都是宝贵的技能。
在使用`json_encode()`时,可以传递第二个参数来调整输出格式,如: - `JSON_PRETTY_PRINT`:使输出的JSON更加易读,通过添加缩进和换行。 - `JSON_UNESCAPED_UNICODE`:保留Unicode字符,而不是转换为`\uXXXX`形式...
### Newtonsoft.Json 使用总结 #### 一、初识 JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写...掌握这些技巧后,开发者能够更高效地在 ASP.NET 应用程序中使用 JSON 数据。
LabVIEW是一种图形化编程语言,广泛应用于数据采集、测试测量和控制系统等领域。在与现代网络服务和应用...通过学习和理解这个示例,用户可以更好地掌握LabVIEW与JSON之间的转换技巧,提升其在实际项目中的应用能力。
本文将详细介绍如何在ASP中使用JSON类以及相关的使用方法。 首先,我们来看`json.asp`文件,这通常是一个包含JSON处理功能的自定义类。这个类库可能提供了如`Encode`和`Decode`等方法,用来将ASP变量转换为JSON字符...
在Web开发领域,jQuery和JSON(JavaScript Object Notation)是两个极为重要的工具。jQuery是一个高效、简洁的JavaScript库,极...在实际开发中,掌握这两者的结合使用技巧,对于提升项目质量和开发效率具有重要意义。
在`com.force.json使用说明.docx`文档中,可能包含了更详细的使用指南和示例,建议仔细阅读以了解更多关于`com.force.json`的高级用法和优化技巧。对于初学者或寻求提高效率的开发者来说,这些都是非常有价值的资源...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被...如果你是初学者,建议从官方文档或在线教程开始,逐步掌握JSON解析的核心知识和技巧。同时,不断实践和应用,以提升对JSON和相关库的掌握程度。
8. **学习资源**:为了更好地使用JSONView,用户可以查找相关教程、文档或在线社区,获取使用技巧和常见问题的解决方案。 以上就是关于JSONView和转换JSON格式的相关知识点,希望对你有所帮助。
JSONEditor是一款强大的在线工具,专为处理...无论你是开发者还是数据分析者,掌握JSONEditor的使用技巧都能大大提高你的工作效率。通过安装和熟练使用这款工具,你可以更轻松地应对日常工作中涉及JSON数据的各种挑战。
在VB(Visual Basic)编程环境中,使用官方API来读写JSON数据格式文件是常见的操作,尤其是在处理网络数据交换或者存储配置信息时。...这个简单实例是一个很好的起点,帮助开发者掌握基本的JSON处理技巧。
总结来说,将集合转换为JSON是Web开发中常用的一种技巧,它使得数据交换更加灵活高效。通过引入如Jackson、Gson和Fastjson这样的库,开发者能够轻松地处理JSON与Java集合间的相互转换,从而提升应用程序的性能和用户...
PB操作JSON库主要涉及到PowerBuilder(PB)编程环境中对JSON数据的处理。JSON(JavaScript Object Notation)是一种轻...同时,掌握JSON的处理技巧也是现代软件开发人员必备的技能之一,无论是在PB还是其他编程环境中。
在实际工作中,掌握JsonViewer的使用技巧能够帮助你更高效地处理JSON数据,提升开发和调试的效率。同时,了解JSON的基础语法和规范也是必不可少的,例如键必须是字符串,数据结构包含对象(键值对)和数组(有序列表...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web服务和应用程序之间的数据传输。...通过这个"json复杂数据解析demo",你可以深入学习和实践这些技巧,进一步提升你的JSON处理能力。
例如,使用`org.json`库中的`JSONObject`和`JSONArray`类可以将JSON字符串转换为对应的Java对象,便于操作。 2. **序列化Java对象**:将Java对象转化为JSON字符串。比如,`com.google.gson.Gson`类允许我们将Java...