设为首页 收藏本站
查看: 645|回复: 0

[经验分享] 使用 Jackson JSON 处理器和 Apache Wink

[复制链接]

尚未签到

发表于 2017-1-9 09:54:40 | 显示全部楼层 |阅读模式
  简介

  Apache Wink 正在快速成长为 JAX-RS 1.0 规范的标准实现之一。JSON.org 和 Jettison 是
JSON 同步的默认提供程序,但是它们自身存在某些问题。例如,它们的数组表示和有限的返回类型使编写 JAX-RS 服务及其客户 Ajax
应用程序变得很困难。
  本文概述了一个配置现有的支持 Apache Wink 的 Web 应用程序来使用 Jackson JSON 提供程序的方法。通过使用一个简单的支持 Jackson 的 JAX-RS Web 服务的 样例代码
来了解这种提供程序的优点。
  Apache Wink 附带的 JSON 提供程序

  Apache Wink 打包了两个 JSON 提供程序作为标准版本的一部分:JSON.org 和 Jettison
实施。这两个提供程序都会使 Wink 服务和 AjaxBoth 应用程序的集成复杂化。这两个提供程序都不能直接将一个 Java
列表作为返回类型序列化到 JSON,因为 JAXB 需要一个封装的 XML 元素。这两者还有一些其他问题,例如:


JSON.org

JSON.org 提供程序的数组序列化是可预见的,但是这个行为在和 Ajax 交互时是不可取的。当它显示各种大小不同的数组时,JSON.org 会以不同的方式呈现它们:


  • 2+
    :“正确的” 数组序列化。例如:object : { array : ["element1", "element2"] }

  • 1
    :折叠数组。例如:object : { array : "element1" }

  • 0
    :完全删除数组。例如:object : { }
  很明显,在 Javascript 中对不同结构的编码限制会导致多余的、不必要的复杂性。



Jettison

    Jettison 对 JSON 生成使用 Badgerfish 惯例,这将生成一种结构,这种结构在转换为 Javascript 对象后很难进行导航。  Jackson

  Jackson 本质上就是一个 JSON 处理器,用于 Java 对象的 JSON 表示的生成和解析。还可以对 Jackson 进行配置,作为 JAX-RS 实现的一个 JSON 序列化提供程序。
  作为一个 JAX-RS JSON 序列化提供程序,如下所述,Jackson 有几个 JSON.org 和 Jettison 所没有的优点。
  

表 1. Jackson 的优点



优点
描述


在本地序列化列表的能力
Jackson 可以直接从服务中返回一个字符串对象的列表,无需一个封装的 XML 元素。


数组处理
Jackson 拥有良好的、可预见的数组序列化设施。


速度
具有比其他提供程序更快的速度。


许可
Apache License 2.0 得到了很好的理解。使用该许可的组件被用于商业和免费软件产品。
  针对 Jackson 配置 Apache Wink

  本文中的示例假设:


  • 您有一个现有的动态 Web 项目,该项目被配置为使用 Apache Wink 作为一个 JAX-RS 提供程序。
  • Wink servlet org.apache.wink.server.internal.servlet.RestServlet
    ,在 web.xml 文件中进行配置,使用一个 JAX-RS 应用程序,如清单 1 所示。
  

清单 1. Wink servlet 的 web.xml 片段




<servlet>
<servlet-name>WinkServlet</servlet-name>
<servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.ibm.developerworks.winkJackson.WinkApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WinkServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>

  下载和安装 Jackson 库

  从 Jackson Web 网站下载 Jackson 的最新版本(链接见 参考资源
)。在编写本文时,Jackson 团队还没有提供使用 Jackson 和 Apache Wink 所需的所有库的独立下载资源。您会需要 JAR 文件的 ASL 或者 LGPL 版本,如下所示。


  • core-(asl/lgpl):Jackson 核心功能
  • mapper-(asl/lgpl):POJO <-> JSON 序列化
  • jax-rs:Wink 和 Jackson 之间的接口
  • jax-xc:和 JAXB 注释的向后兼容性
  JAR 文件必须显示在您的 Web 项目的类路径下。实现此目的的最简单的方法就是将它们放置在您的 WEB-INF/lib 目录。(您的 Apache Wink JAR 文件可能已经在这个目录下。)

加入 My developerWorks 的 Apache Wink 组
  在 My developerWorks Apache Wink 组
中与其他开发人员讨论有关用 Apache Wink 开发 RESTful
Web 服务的话题并分享资源。
  您还不是 My developerWorks 的一员?现在就加入!





  配置 Apache Wink 来使用 Jackson 提供程序进行 JSON 序列化

  现在,Jackson JSON 提供程序作为您的 Web 应用程序的一部分进行加载,但是 Apache Wink 还尚未使用它来进行 JSON 序列化。
  调整 Wink servlet 的已配置过的应用程序来加载提供应用程序,如清单 2 所示。
  

清单 2. WinkApplication.java 示例




package com.ibm.developerworks.winkJackson;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
// Jackson imports
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.AnnotationIntrospector;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
public class WinkApplication extends Application {
/**
* Get the list of service classes provided by this JAX-RS application
*/
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> serviceClasses = new HashSet<Class<?>>();
serviceClasses.add(HelloWorlds.class);
return serviceClasses;
}
@Override
public Set<Object> getSingletons() {
Set<Object> s = new HashSet<Object>();
// Register the Jackson provider for JSON
// Make (de)serializer use a subset of JAXB and (afterwards) Jackson annotations
// See http://wiki.fasterxml.com/JacksonJAXBAnnotations for more information
ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
mapper.getSerializationConfig().setAnnotationIntrospector(pair);
// Set up the provider
JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider();
jaxbProvider.setMapper(mapper);
s.add(jaxbProvider);
return s;
}
}
  Direct List<?> 序列化

  Jackson 使您能够轻松地从其函数返回 Java 列表,不需要包装器 JAXB XML 元素。如清单 3 所示。
  

清单 3. HelloWorlds.java




package com.ibm.developerworks.winkJackson;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("helloworlds")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorlds {
@GET
public List<String> helloWorlds() {
return Arrays.asList(new String [] {"Hello Earth!",  "Hello Mars!" });
}
}

  结束语

  Apache Wink 作为 JAX-RS 规范的实现得到了日益广泛的应用。JSON.org、Jettison 和 JSON 等面向
JSON 同步的默认提供程序存在某些问题。在本文中,您了解了如何配置已有的支持 Apache Wink 的 Web 应用程序来使用
Jackson JSON 提供程序。本文中的例子通过使用一个支持 Jackson 的简单 JAX-RS Web
服务的示例代码展示了该提供程序的优点。
  原文:http://www.ibm.com/developerworks/cn/web/wa-aj-jackson/index.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-325846-1-1.html 上篇帖子: APACHE 2.2.9+TOMCAT6.0.18配置负载均衡 下篇帖子: 在windows下使用Apache搭建Subversion (一) 基础搭建 .
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表