`
zl198751
  • 浏览: 282458 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Json-lib

阅读更多

JSONSerializer的toJSON方法可以把参数指定的对象转换成一个JSON接 口的对象,如果这个对象是一个String对象,那么这个方法还会校验这个String对象是否是一个合法的JSON字符串(即是否符合JavaScript 的语法)。对于一般JavaBean(必须是标准的具有setter\getter的JavaBean)的转换就是按照属性值对的方式生成JS对象,缺省 的情况下Map会转换成对象,而List和数组会转换为数组。

JSONSerializer的toJava方法可以把JSON接口的对象转换为 JavaBean对象,缺省情况下,JSON接口的对象会被转换为net.sf.ezmorph.bean.MorphDynaBean对象,所有基本类 型(基本类型包装类)、数组和String类型的属性都会被准确的装换,而其他类型(如Map等)都会被缺省的转换为 net.sf.ezmorph.bean.MorphDynaBean对象。

以上是使用JSONSerializer的缺省转换函数(一个参数)进行转换的结果,如果使 用两个参数的转换函数(第二个参数为JsonConfig对象),则会按照JsonConfig的配置进行转换。toJSON转换时的配置:

setJsonPropertyFilter属性过滤,用于处理那些属性被过滤掉而不被转化 换为JSON,嵌套引用的Bean的属性也可以被过滤。如下:

/* 使用属性过滤器 */

myBeanJc.setJsonPropertyFilter(new PropertyFilter() {

@Override

public boolean apply(Object o, String n, Object v) {

                                   if (o instanceof MyBean && n.equals("beanMap")) {

                                          MyBean mb = (MyBean) o;

                                          if (mb.getBeanMap().keySet().isEmpty())

                                                 return true;

                                   } else if (o instanceof MyInnerBean && n.equals("attrMap")) {

                                          Map<String, String> m = (Map<String, String>) v;

                                          if (m.keySet().isEmpty())

                                                 return true;

                                   } else

                                          ;

                                   return false;

                            }

 

                     });                              

这个例子使用了匿名类的方式实现了一个自定义的属性过滤器,其实就是覆盖apply方法,这 个方法的返回值决定是否把此属性过滤掉(true表示过滤掉此属性而不转化到JSON中)。json-lib本身提供一些实现了 PropertyFilter的属性过滤器类供我们使用,如AndPropertyFilter, CompositePropertyFilter, FalsePropertyFilter, MappingPropertyFilter, NotPropertyFilter, OrPropertyFilter, TruePropertyFilter等,有兴趣的话可以逐个试验。

registerJsonBeanProcessor注册 JsonBeanProcessor,使用JsonBeanProcessor处理bean对象到JSON接口对象的转换,它给我们提供了自定义的 bean到JSON的转换的接口,通过注册自定义的JsonBeanProcessor我们可以按照自己的想法把bean转化成我们想要的样子。如下:

/* 使用JsonBeanProcessor处理bean对象到json对象的转换 */

                     myBeanJc.registerJsonBeanProcessor(MyInnerBean.class,

                                   new JsonBeanProcessor() {

 

                                          @Override

                                          public JSONObject processBean(Object o, JsonConfig jc) {

                                                 return JSONObject

                                                               .fromObject("{title : ’I am an inner bean!’}");

                                          }

                                   });

这个例子就给MyInnerBean注册了一个自定义的 JsonBeanProcessor,使用匿名类的方式实现了processBean方法,processBean方法返回的JSON对象就是在进行 bean到JSON转化时MyInnerBean对象转化成的JSON对象。

setJsonBeanProcessorMatcher可以设置用于匹配 JsonBeanProcessor的自定义的匹配器JsonBeanProcessorMatcher,通过实现 JsonBeanProcessorMatcher的getMatch方法(这个方法有两个参数,第一个是需要匹配的对象的Class对象,第二个参数是 所有注册了JsonBeanProcessor的Class对象的集合),返回一个Calss对象,转换器会用以返回的Class对象注册的 JsonBeanProcessor处理这个类的转换。如下:

/* 设置处理过程的注册类匹配器 */

                     myBeanJc

                                   .setJsonBeanProcessorMatcher(new JsonBeanProcessorMatcher() {

 

                                          @Override

                                          public Object getMatch(Class c, Set s) {

                                                 if (c.equals(MyInnerBean.class))

                                                        return innerClzz.class;

                                                 return c;

                                          }

                                   });

这个例子使用匿名类实现了一个自定义的JsonBeanProcessorMatcher, 覆盖了getMatch方法,它表示在bean到JSON的转化过程中,如果我们要处理的类是MyInnerBean类,则返回innerClzz类,这 时就会使用innerClzz注册的JsonBeanProcessor来处理这个MyInnerBean,如果我们没有为innerClzz注册 JsonBeanProcessor,则使用缺省的转化过程处理(属性值对的方式)。

registerJsonValueProcessor注册 JsonValueProcessor,使用JsonValueProcessor处理Bean对象的属性值的转换,这里是为指定的数据类型注册 JsonValueProcessor。如下:

/* 使用JsonValueProcessor处理Bean对象的属性值的转换 */

                     myBeanJc.registerJsonValueProcessor(Double.class,

                                   new JsonValueProcessor() {

 

                                          @Override

                                          public Object processArrayValue(Object arg0,

                                                        JsonConfig arg1) {

                                                 return null;

                                          }

 

                                          @Override

                                          public Object processObjectValue(String k, Object v,

                                                        JsonConfig arg2) {

                                                 if (k.equals("dblVal"))

                                                        return Double.valueOf(v.toString())

                                                                      .doubleValue()

                                                                      * 100 + "%";

                                                 else

                                                        return v;

                                          }

 

                                   });

这个例子就是为双精度浮点型注册了一个JsonValueProcessor,需要我们覆盖 两个方法,从名称就能明白它们是分别处理数组和对象中的指定数据类型的方法。在这里我们把属性dblVal的双精度浮点值转化为表示百分比的字符串,对于 其他的双精度浮点值不做处理。

注册处理过程的方法都有其对应的反注册(unregisterXxProcessor)方 法,同时还提供了查找这些处理过程的方法(findXxProcessor)。

setExcludes设置不作转换的属性名称,getExcludes可以返回设置的属性 名称字符串数组,而getMergedExcludes可以返回所有不做转换的属性集合,包括setExcludes设置的属性名称。

setJavaIdentifierTransformer设置使用何种Java标识符的转 换器,没太看懂,JavaIdentifierTransformer倒是挺好理解,可是这个转换功能如何使用,在什么时候使用呢?

setArrayMode设置数组的转换模式,也不会用。

setRootClass设置根对象目标类,也就是从JSON接口对象转换为bean时得到 的对象的Java类,如果不设置的话,就转换为MorphDynaBean。

setNewBeanInstanceStrategy用于设置对象实例化时使用的策略,缺 省的是使用Class的newInstance方法。从JSON接口对象转换成JavaBean对象时首先应用该策略,然后才会用JSON接口对象的内容 为实例赋值。如下:

/* 设置对象实例化策略 */

                     myBeanJc.setNewBeanInstanceStrategy(new NewBeanInstanceStrategy() {

 

                            @Override

                            public Object newInstance(Class c, JSONObject jo)

                                          throws InstantiationException, IllegalAccessException {

                                   Object o;

                                   if (c.equals(MyInnerBean.class)) {

                                          String t = "Recovered " + jo.get("title");

                                          jo.put("title", t);

                                          o = new MyInnerBean();

                                   }else

                                          o = c.newInstance();

                                   return o;

                            }

                     });

这个例子中, 使用匿名类的方式覆盖newInstance方法,如果是MyInnerBean类则使用无参构造函数实例化对象,其他情况下使用缺省的实例化方式。因为 从JSON接口对象转换成JavaBean对象时首先应用该策略,然后才会用JSON接口对象的内容为实例赋值,所以在这里为实例化对象赋值是没有意义 的,如果想改变最后的bean的属性值,可以通过修改JSON对象的属性值来实现。

setClassMap应该是用于JSON和XML转换的,有待进一步研究。

此外还有其他相对简单的转换过程配置选项的功能,比较容易理解和使用,类似于开关量。 如:disableEventTriggering() ,enableEventTriggering()等等。

分享到:
评论

相关推荐

    json-lib-2.4 jar 程序文件

    `json-lib-2.4 jar`是JSON-Lib的一个版本,它是一个针对Java的开源项目,用于在Java对象和JSON数据之间进行转换。这个版本兼容JDK 15及更高版本,意味着它能够很好地运行在较新的Java环境中。这个jar包包含了一系列...

    json-lib-2.2.2-jdk15.jar

    json-lib-2.2.2-jdk15.jar是JSON库的一个版本,特别针对Java 1.5(JDK 1.5)进行了优化。这个压缩包包含了json-lib库的二进制文件,用于在Android和Java平台上解析和生成JSON数据。尽管这个版本是针对JDK 1.5,但...

    json-lib-2.2.3-jdk15.jar

    该库名为`json-lib-2.2.3-jdk15.jar`,特别针对Java 1.5版本进行了优化。 JSON-lib的主要特点和功能包括: 1. **数据转换**:它支持将Java的各种类型,如Map、List、数组、自定义对象等,转换成JSON格式的字符串。...

    json-lib-2.4-jdk15.jar

    json-lib-2.4-jdk15.jar是json-lib的一个特定版本,适用于JDK 1.5环境。这个版本的库包含了一系列API和实现,使得开发人员能够无缝地在Java应用中使用JSON。它支持多种Java对象类型,包括Map、List、Set、自定义Java...

    json-lib应用所有jar

    JSON-lib是Java平台上的一个库,它提供了一种方便的方式来序列化和反序列化Java对象为JSON格式,以及从JSON字符串恢复Java对象。这个库在处理JSON数据时非常实用,特别是对于那些需要在服务器端和客户端之间进行数据...

    json-lib-2.3.jar

    json-lib-2.3.jar是这个库的一个版本,用于支持将Java对象转换成JSON格式和将JSON数据反序列化为Java对象。 标题中提到的"json-lib-2.3.jar"是json-lib库的一个具体实现,主要包含了一系列处理JSON的类和方法。这个...

    json-lib-2.4和相应的依赖包

    JSON库如json-lib-2.4是Java开发者在处理JSON数据时的重要工具,它提供了一系列API,使得JSON与Java对象之间的转换变得更加简单。本文将深入探讨json-lib-2.4及其在Java开发中的应用。 首先,json-lib-2.4是一个...

    json-lib-2.4-jdk15和全部依赖jar包

    `json-lib-2.4-jdk15`是JSON库的一个特定版本,专为JDK 1.5设计,确保在该环境下能够正常运行。 `json-lib`库主要包含以下组件和功能: 1. **JSON转换**:`json-lib`提供了将Java对象如Map、List、自定义类等转换...

    json-lib-2.3-jdk15开发包和所有依赖包

    `json-lib-2.3-jdk15`是这个库的一个特定版本,兼容JDK 1.5,这意味着它可以在运行JDK 1.5或更高版本的Java环境中使用。 在Java开发中,`json-lib`库提供了以下关键功能: 1. **JSON对象的创建与解析**:通过`...

    json-lib-2.4-jdk15.jar下载

    json-lib-2.4-jdk15.jar下载,json-lib是一款简单易用的Java JSON库。它可以将Java对象转换成JSON字符串,也可以将JSON字符串转换成Java对象。json-lib体积小、无依赖,性能表现也不错,适合在各种Java项目中使用。 ...

    json-lib-2.4-jdk15及其依赖jar包

    JSON-Lib-2.4-jdk15是JSON-Lib的一个特定版本,它针对JDK 1.5进行了优化,以适应该版本的Java环境。这个库包含了处理JSON的多种功能,包括将Java对象转换为JSON字符串,以及将JSON文本解析回相应的Java对象。这对于...

    使用json-lib实现json与Java对象的互转

    `json-lib` 是一个 Java 库,它提供了将 JSON 格式的数据转换为 Java 对象,以及将 Java 对象转换为 JSON 格式数据的功能。在 Java 开发中,`json-lib` 是一个常用的 JSON 处理工具,尤其适用于需要处理复杂 JSON ...

    ezmorph-1.0.6.jar和json-lib-2.2.2-jdk15.rar

    标题中的"ezmorph-1.0.6.jar"和"json-lib-2.2.2-jdk15.rar"指的是两个不同的Java库,用于处理数据转换和JSON操作。ezmorph是一个Java库,提供了对象到对象的转换功能,而json-lib是另一个库,专门用于处理JSON...

    json-lib-2.4-jdk15及其依赖包

    1、json的核心包:json-lib-2.4-jdk15.jar; 2、json-lib-2.4-jdk15.jar依赖的jar包:commons-beanutils-1.9.3.jar,commons-collections-3.2.2.jar,commons-lang-2.6.jar,commons-logging-1.2.jar,ezmorph-1.0.6...

    json-lib-2.4-jdk13对应jar包大全

    在这个“json-lib-2.4-jdk13对应jar包大全”中,包含了以下6个关键的jar包,它们是json-lib运行和功能完整的必要组成部分: 1. **commons-collections-3.2.2.jar**:Apache Commons Collections库提供了对集合框架...

    json-lib-2.4-jdk15.jar及其相关依赖

    `json-lib-2.4-jdk15.jar`是这个库的一个特定版本,适用于JDK 1.5环境。 在Java开发中,`json-lib`库提供了多种将Java对象序列化为JSON字符串的方法,包括: 1. **Java Bean到JSON**: 只需传入一个Java Bean对象,...

    json-lib所用的jar包

    4. `json-lib-2.4-jdk15.jar`:这是核心的`json-lib`库,包含了JSON转换和解析的实现。版本号2.4表明这是该库的一个较新版本,兼容JDK 1.5,可以处理多种Java类型的数据转化为JSON。 5. `ezmorph-1.0.6.jar`:...

    json-lib-2.4-jdk15-sources.jar

    总的来说,`json-lib-2.4-jdk15-sources.jar`为开发者提供了一个强大的工具,不仅能够方便地处理JSON数据,还通过源码开放了学习和定制的空间,对于提升Java Web开发技能大有裨益。通过研究这个库,我们可以更好地...

    json-lib-2.4-jdk15所需要的jar包

    `json-lib-2.4-jdk15`是其中的一个版本,专为JDK 1.5设计,提供了对JSON对象与Java对象之间的转换功能。 标题中的“json-lib-2.4-jdk15所需要的jar包”指的是这个特定版本的JSON库的Java档案(JAR)文件,它包含了...

    json-lib 2.4 的 jar 包

    通过引入`json-lib-2.4-jdk15.jar`,开发者可以在项目中轻松地集成JSON操作。 1. **JSON对象与Java对象的转换:** - 序列化:将Java对象转换为JSON字符串。例如,一个User类的对象可以通过json-lib转化为JSON格式...

Global site tag (gtag.js) - Google Analytics