Jackson2笔记

官方WIKI:https://github.com/FasterXML/jackson-databind/wiki

jackson 1.x和2.x版本的注解是放置在不同的包下的
      1.x是在jackson core jar包org.codehaus.jackson.annotate下
      2.x是在jackson-databind包com.fasterxml.jackson.annotation下

      jackson-core---核心包(必须),streaming parser/generator,即流式的解析器和生成器,提供基于“流模式”解析的API。核心:JsonPaser(json流读取),JsonGenerator(json流输出)。
      jackson-annotations---注解包(可选),提供注解功能。
      jackson-databind---数据绑定包(可选),提供基于 ObjectMapper, Json Tree Model(即对象映射器,JSON树模型)相关API。


常用注解

@JsonIgnoreProperties
类注解, 作用类上。作用是json序列化和反序列化时将java bean中的一些属性忽略掉。用法@JsonIgnoreProperties({"property1","property2"})。@JsonIgnoreProperties(ignoreUnknown=true) 会忽略缺少、不匹配的字段。

@JsonIgnore
作用于属性或字段上,用来表明,当生成json或解析json的时候忽略有该annotation的方法或字段。效果同上。

@JsonProperty("firstName")
作用于属性或字段上,重命名。

@JsonFormat
作用于属性或者字段上,方便的把Date类型直接转化为我们想要的模式,如@JsonFormat(pattern ="yyyy-MM-dd HH-mm-ss")


配置SerializationFeature

详细参见:
http://fasterxml.github.io/jackson-databind/javadoc/2.0.2/com/fasterxml/jackson/databind/SerializationFeature.html
SerializationFeature.INDENT_OUTPUT:是否缩放排列输出,默认false,有些场合为了便于排版阅读则需要对输出做缩放排列。
   objectMapper.configure(SerializationFeature.INDENT_OUTPUT,true);  

SerializationFeature.WRITE_DATES_AS_TIMESTAMPS:序列化日期时以timestamps输出,默认true。
SerializationFeature.WRITE_ENUMS_USING_TO_STRING:序列化枚举是以toString()来输出,默认false,即默认以name()来输出。
SerializationFeature.WRITE_ENUMS_USING_INDEX:序列化枚举是以ordinal()来输出,默认false。


配置DeserializationFeature

详细参见:
http://fasterxml.github.io/jackson-databind/javadoc/2.0.2/com/fasterxml/jackson/databind/SerializationFeature.html
常用配置:
     nonStrict_objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
效果类似@JsonIgnoreProperties(ignoreUnknown=true),会忽略缺少、不匹配的字段。


简单的JacksonUtil

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public final class JacksonUtil {

	private static class ObjectMapperHolder {
		private static final ObjectMapper strict_objectMapper;
		private static ObjectMapper nonStrict_objectMapper;
		static {
			strict_objectMapper = new ObjectMapper();
			nonStrict_objectMapper = new ObjectMapper();
			nonStrict_objectMapper.configure(
					DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		}
	}

	private JacksonUtil() {
		throw new AssertionError();
	}

	/**
	 * json字符串转Object,严格要求json字段与Object字段一一对应
	 * 
	 * @param jsonStr
	 * @param cls
	 * @return
	 * @throws Exception
	 */
	public static <T> T jsonStr2ObjectStrict(String jsonStr, Class<T> cls)
			throws Exception {
		return (T) ObjectMapperHolder.strict_objectMapper.readValue(jsonStr,
				cls);
	}

	/**
	 * json字符串转Object,非严格要求json字段与Object字段一一对应
	 * 
	 * @param jsonStr
	 * @param cls
	 * @return
	 * @throws Exception
	 */
	public static <T> T jsonStr2ObjectNonStrict(String jsonStr, Class<T> cls)
			throws Exception {
		return  (T) ObjectMapperHolder.nonStrict_objectMapper
				.readValue(jsonStr, cls);
	}

	/**
	 * 将object转json字符串
	 * 
	 */
	public static <T> String object2JsonStr(T instance) {
		try {
			return ObjectMapperHolder.strict_objectMapper
					.writeValueAsString(instance);
		} catch (Exception e) {
		}
		return null;
	}

	/**
	 * 根据field来解析jsonStr
	 * 
	 */
	public static String getFieldStr(String jsonStr, String field) {
		try {
			JsonNode node = ObjectMapperHolder.strict_objectMapper
					.readTree(jsonStr);
			if (null != node) {
				return node.get(field).asText();
			}
		} catch (Exception e) {
		}
		return null;
	}

	/**
	 * 根据field来解析jsonStr,异常时返回null
	 * 
	 */
	public static String[] getFieldStr(String jsonStr, String... field) {
		int len = field.length;
		try {
			JsonNode node = ObjectMapperHolder.strict_objectMapper
					.readTree(jsonStr);
			if (null != node) {
				String[] strs = new String[len];
				for (int i = 0; i < len; i++) {
					strs[i] = node.get(field[i]).asText();
				}
				return strs;
			}
		} catch (Exception e) {
		}
		return null;
	}
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值