`
这些年
  • 浏览: 399781 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jackson注解学习参考 (转)

    博客分类:
  • java
 
阅读更多

1:返回json去掉空值

@JsonSerialize(include = Inclusion.NON_NULL)

 2:去掉只定属性(加到属性上有时不管用,可加到get方法上)

@JsonIgnore

 3:时间格式化

@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")

 或者自定意

package com.chinacache.utils;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

public class CustomDateSerializer extends JsonSerializer<Date> {

	@Override
	public void serialize(Date value, JsonGenerator jgen,

	SerializerProvider provider) throws IOException,

	JsonProcessingException {

		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");

		String formattedDate = formatter.format(value);

		jgen.writeString(formattedDate);

	}

}

 方法上加入注解

@JsonSerialize(using = CustomDateSerializer.class)
	public Date getDAY() {
		return DAY;
	}

4:返回json中替换key name(不写的话,默认json key是小写的data;http://duanfei.iteye.com/blog/1683195

	@JsonProperty("DATA") 
	public Long getDATA() {
		return DATA;
	}

 

(1)初级
我们从几个简单的使用场景开始:重命名属性,忽略属性,以及修改属性所使用的类型。
注意:下面的例子仅仅显示了成员属性(field properties),注解同样也可以用在成员方法(getter/setter)上。
①属性重命名时使用的注解
最常见的使用方式之一就是改变某个成员属性所使用的JSON名称,例如:

public class Name {
  @JsonProperty("firstName")
  public String _first_name;
}

将会生成如下所示的JSON数据结果:
{ "firstName" : "Bob" }

而不是:
{ "_first_name" : "Bob"}

②忽略属性时使用的注解
有时POJO包括了一些你不希望输出的属性,在这种情况下,你可以进行如下操作:
public class Value {
  public int value;
  @JsonIgnore public int internalValue;
}

这时得到的JSON数据结果如下:
{ "value" : 42 }

或者,你可能忽略掉某些从JSON数据中得到的属性,如果是这样,你可以使用:
@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
  public int value;
}

这样就能够处理像如下所示的JSON数据:
{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 }

最后,你甚至能简单地忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。你可以通过添加如下代码完成这个操作:
@JsonIgnoreProperties(ignoreUnknown=true)
public class PojoWithAny {
  public int value;
}

③选择更多/更少(more/less)指定类型(specific types)时使用的注解
在有些情况下,Jackson在读入或输出一个成员属性时,所选用的类型(type)可能并不是你想要的:
•当读取(反序列化)时,声明的类型(declared type)可能是一个基本类型(general type),但是你确切地知道应该使用的实现类型(译注:也就说,我们需要反序列化后生成的对象是实现类型的);
•当输出(序列化)时,Jackson默认使用的是给定的运行时类型(the specific runtime type);但是你可能不想输出那个类型的所有信息,而仅仅是它的父类型所囊括的信息。
在这些应用场景,你可以使用如下的注解进行处理:
public class ValueContainer {
  // 虽然代码中使用的类型(type)是'Value', 但我们希望读取到的JSON 之后得到的对象的类型是'ValueImpl'
  @JsonDeserialize(as=ValueImpl.class)
  public Value value;

  // 虽然运行时的类型(type)可能是'AdvancedType'(高级类型), 但是我们确实想序列化
  // 成为'BasicType'(基础类型); 有两种处理方式:
  @JsonSerialize(as=BasicType.class)
  // 或者我们可以这样: @JsonSerialize(typing=Typing.STATIC)
  public BasicType another;
}

(2)中级
①使用构造器或工厂方法
在默认情况下,当由JSON数据创建相应类的实例时,Jackson尝试使用该类的“默认”构造器(即无参数构造器)。不过,你可以选择使用其他的构造器,或者一个静态工厂方法,来创建实例。完成这个操作,你需要使用@JsonCreator注解,有可能还需要使用@JsonProperty注解给参数(arguments)绑定名称。
public class CtorPOJO {
   private final int _x, _y;

   @JsonCreator
   public CtorPOJO(@JsonProperty("x") int x, @JsonProperty("y") int y) {
      _x = x;
      _y = y;
   }
}

使用相同的方式,可以将@JsonCreator用在静态工厂方法上。不过,还有一个可选的替代方案,被称作“授权式”构建器(“delegating” creator):

public class DelegatingPOJO {
   private final int _x, _y;

   @JsonCreator
   public DelegatingPOJO(Map<String,Object> delegate) {
      _x = (Integer) delegate.get("x");
      _y = (Integer) delegate.get("y");
   }
}

不同之处在于,构建器方法只能有一个参数,而且参数一定不要(must NOT)添加@JsonProperty注解。

②处理多态类型(polymorphic types)
如果你要进行读取、输出操作的对象拥有许多可能的子类型(即表现出多态性),你可能还需要添加一些类型信息。Jackson在反序列化时(读取JSON数据,生成相应的对象)需要这些信息,以便能正确地读取对象的类型。我们可以通过在“基本类型”上添加@JsonTypeInfo注解来完成操作:
//将Java类的名称(“com.myempl.ImplClass”)存储到JSON的一个名称为“class”的属性中
@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY,property=”class”)
public abstract class BaseClass {
}

public class Impl1 extends BaseClass {
public int x;
}

public class Impl2 extends BaseClass {
public String name;
}

public class PojoWithTypedObjects {
public List<BaseClass> items;
}

这样,序列化之后的JSON格式如下:
{“items” : [
{“class”:”Impl2”,  “name”: “Bob”},
{“class”:”Impl1”, :”x” : 13}
]}

注意:这个注解还有很多配置可以进行设置,详细内容请查阅浏览:
• Javadocs
• 多态类型处理简介I(ntro to polymorphic type handling)


③重新设置属性的自动发现(Changing property auto-detection)
Jackson默认的属性发现规则将会查找到如下所述的属性:
•所有被public修饰的字段(成员变量);
•所有被public修饰的getter(即形如“getXxx()”的方法);
•所有被public修饰的setter(即形如“setXxx(value)”的方法),不管可见或不可见。
不过如果这样也不行,你可以通过使用使用注解@JsonAutoDetect来改变可见级别。如果你想自动发现所有的字段(就像GSON包所进行的操作那样),你可以这样做:
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
public class POJOWithFields {
private int value;
}
或者,你想禁用对所有字段的自动发现:
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
public class POJOWithNoFields {
//不会被序列化,除非再有一个可以访问的“getValue”方法
public int value;
}

分享到:
评论

相关推荐

    Jackson注解学习参考

    这篇“Jackson注解学习参考”文档很可能是对Jackson库中常用注解的一个详细讲解。在深入探讨之前,先了解JSON库在开发中的作用至关重要:它允许应用程序之间交换数据,特别是在Web服务和客户端之间。 Jackson库的...

    Jackson 框架 json 到 复杂 list 的转换

    4. **注解(Annotations)**:Jackson提供了一系列注解,如`@JsonProperty`、`@JsonIgnore`、`@JsonInclude`等,用于定制序列化和反序列化的规则。例如,`@JsonProperty`指定属性与JSON键的映射,`@JsonIgnore`忽略...

    json转换工具jackson

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于前后端数据传输。Jackson是Java领域中处理JSON的主流库之一,由...对于进一步学习,可以参考Jackson官方文档、社区讨论以及相关的技术博客。

    Jackson资源jar包+api

    而"jacksonapi"可能是指Jackson的API文档,对于开发者来说,它是理解和使用Jackson库的重要参考资料。 Jackson库的核心组件包括: 1. **Jackson-databind**:这是最常用的部分,提供了将Java对象映射到JSON,以及从...

    jackson技术文档.rar

    3. 注解驱动:Jackson支持使用Java注解来定制序列化和反序列化行为。例如,`@JsonProperty`用于指定字段映射,`@JsonInclude`控制字段的包含策略,`@JsonFormat`处理日期和时间格式等。 4. 数据绑定:Jackson的数据...

    注解式springMVC的demo

    在本文中,我们将深入探讨“注解式Spring MVC”的概念及其在实际开发中的应用。Spring MVC是Spring框架的一部分...在 MvcTest 子文件中,可能包含了演示这些概念的示例代码,你可以通过学习和运行这些代码来加深理解。

    jackson-src-1.8.1.jar.zip

    源代码可以作为深入理解JSON序列化机制的参考,开发者可以通过阅读源代码来学习Jackson的内部实现,以及如何根据项目需求进行定制和扩展。 在实际项目中,Jackson常与其他技术结合使用,如Spring框架、JAX-RS API等...

    技術分享_RESTful_with_Jackson1

    GlassFish 4是Java EE 7的参考实现,提供了许多有用的功能,例如RESTful服务、JSON支持等。 创建RESTful服务 创建RESTful服务需要使用Java EE的JAX-RS(Java API for RESTful Web Services)API。JAX-RS提供了一些...

    Jackson高性能的JSON处理 v2.11.4-源码.zip

    3. 注解增强:Jackson提供了丰富的注解,如`@JsonProperty`、`@JsonInclude`、`@JsonAutoDetect`等,使得开发者可以通过注解轻松配置序列化和反序列化的行为。 4. 自定义序列化器和反序列化器:通过实现`...

    Java_Jackson的核心部分,定义了流API以及基本的共享抽象.zip

    通过阅读源代码或参考相关文档,开发者可以更深入地理解Jackson的工作原理,从而更好地利用这个库来处理JSON数据。 总而言之,Java Jackson的核心部分——流API和共享抽象,为处理JSON数据提供了高效、灵活的工具。...

    micronaut-jackson-xml:Micronaut 与 Jackson XML 的集成

    《Micronaut与Jackson XML的深度集成解析》 在当今的软件开发中,微服务架构以其轻量级、...通过不断学习和实践,我们可以更好地掌握Micronaut框架和Jackson XML的集成,提高开发效率,打造出更加健壮的微服务系统。

    SpringBoot返回json和xml的示例代码

    **本篇文章主要介绍了SpringBoot返回json和xml的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考**: 1. 文章的内容针对Spring Boot的初学者或需要处理XML数据格式的开发者。 2. 提供的示例代码将...

    java的创建服务以及调用服务学习参考

    对于JSON数据,可以使用Gson或Jackson库将其转换为Java对象。 三、RESTful服务实战 1. **创建服务**:假设我们创建一个用户管理服务,有一个`/users`资源,提供GET、POST方法。GET方法用于获取所有用户,POST方法...

    Android项目:扬子地板仓库管理系统说明资源来源网络以及部分开源社区、仅供参考与学习、项目不可商用、一切后果由使用者承担

    值得注意的是,该项目的资源来源于网络和部分开源社区,其目的是为了供学习和参考,不得用于商业用途,使用者应自行承担可能产生的后果。 首先,Android项目的基础是Java编程语言和Android SDK。开发者通常会利用...

    jersey-server-jackson:杰森(Jason)与杰克逊(Jackson)的例子

    Jersey是JAX-RS(Java API for RESTful Web Services)规范的参考实现,而Jackson是Java中广泛使用的JSON序列化和反序列化库。 【描述】"泽西服务器杰克逊"这部分内容暗示了我们将探讨如何在Jersey服务器端利用...

    Spring Boot 学习笔记完整教程new

    3. **使用其他JSON转换框架**:除了默认的Jackson库,Spring Boot也支持Gson或其他JSON库,通过配置即可切换。 4. **全局异常处理**:Spring Boot提供了@ControllerAdvice和@ExceptionHandler注解来捕获并处理全局...

    java常用框架学习笔记

    ### Java常用框架学习笔记 #### Hibernate ##### 1.1 Hibernate 实现数据库操作步骤 - **导入所需的Jar包**:为了使用Hibernate框架,首先需要在项目中导入Hibernate库。这通常意味着添加一系列与Hibernate相关的...

    Spring RESTful服务接收和返回JSON最佳实践

    在构建Web服务时,Spring框架提供了强大的支持,特别是在创建RESTful API方面。REST(Representational State Transfer)是一种架构...对于进一步的学习,可以参考提供的博文链接,了解更多实际示例和具体实现细节。

    SpringMVC架构入门

    SpringMVC是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。这个架构模式将应用程序的...在学习过程中,可以通过阅读官方文档、参考书籍和在线教程来深入理解SpringMVC的更多高级特性。

Global site tag (gtag.js) - Google Analytics