`

利用Jackson对Object,Map,List,数组,枚举,日期类等转化为json

    博客分类:
  • json
阅读更多
[color=violet][size=large]
public class JsonBinder {

	private static Logger logger = LoggerFactory.getLogger(JsonBinder.class);

	private ObjectMapper mapper;

	public JsonBinder(Inclusion inclusion) {
		mapper = new ObjectMapper();
		//设置输出包含的属性
		mapper.getSerializationConfig().setSerializationInclusion(inclusion);
		//设置输入时忽略JSON字符串中存在而Java对象实际没有的属性
		mapper.getDeserializationConfig().set(
				org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
	}

	/**
	 * 创建输出全部属性到Json字符串的Binder.
	 */
	public static JsonBinder buildNormalBinder() {
		return new JsonBinder(Inclusion.ALWAYS);
	}

	/**
	 * 创建只输出非空属性到Json字符串的Binder.
	 */
	public static JsonBinder buildNonNullBinder() {
		return new JsonBinder(Inclusion.NON_NULL);
	}

	/**
	 * 创建只输出初始值被改变的属性到Json字符串的Binder.
	 */
	public static JsonBinder buildNonDefaultBinder() {
		return new JsonBinder(Inclusion.NON_DEFAULT);
	}

	/**
	 * 如果JSON字符串为Null或"null"字符串,返回Null.
	 * 如果JSON字符串为"[]",返回空集合.
	 * 
	 * 如需读取集合如List/Map,且不是List<String>这种简单类型时使用如下语句:
	 * List<MyBean> beanList = binder.getMapper().readValue(listString, new TypeReference<List<MyBean>>() {});
	 */
	public <T> T fromJson(String jsonString, Class<T> clazz) {
		if (StringUtils.isEmpty(jsonString)) {
			return null;
		}

		try {
			return mapper.readValue(jsonString, clazz);
		} catch (IOException e) {
			logger.warn("parse json string error:" + jsonString, e);
			return null;
		}
	}

	/**
	 * 如果对象为Null,返回"null".
	 * 如果集合为空集合,返回"[]".
	 */
	public String toJson(Object object) {

		try {
			return mapper.writeValueAsString(object);
		} catch (IOException e) {
			logger.warn("write to json string error:" + object, e);
			return null;
		}
	}

	/**
	 * 设置转换日期类型的format pattern,如果不设置默认打印Timestamp毫秒数.
	 */
	public void setDateFormat(String pattern) {
		if (StringUtils.isNotBlank(pattern)) {
			DateFormat df = new SimpleDateFormat(pattern);
			mapper.getSerializationConfig().setDateFormat(df);
			mapper.getDeserializationConfig().setDateFormat(df);
		}
	}

	/**
	 * 取出Mapper做进一步的设置或使用其他序列化API.
	 */
	public ObjectMapper getMapper() {
		return mapper;
	}
}

在其他类中定义jsonBinder对象:
private static JsonBinder binder = JsonBinder.buildNonDefaultBinder();

以下是对象到json字符串以及json字符串到对象的转化:
/**
* 序列化对象/集合到Json字符串.
*/
@Test
	public void toJson() throws Exception {
		//Bean
		TestBean bean = new TestBean("A");
		String beanString = binder.toJson(bean);
		System.out.println("Bean:" + beanString);
		assertEquals("{\"name\":\"A\"}", beanString);

		//Map
		Map<String, Object> map = Maps.newLinkedHashMap();
		map.put("name", "A");
		map.put("age", 2);
		String mapString = binder.toJson(map);
		System.out.println("Map:" + mapString);
		assertEquals("{\"name\":\"A\",\"age\":2}", mapString);

		//List<String>
		List<String> stringList = Lists.newArrayList("A", "B", "C");
		String listString = binder.toJson(stringList);
		System.out.println("String List:" + listString);
		assertEquals("[\"A\",\"B\",\"C\"]", listString);

		//List<Bean>
		List<TestBean> beanList = Lists.newArrayList(new TestBean("A"), new TestBean("B"));
		String beanListString = binder.toJson(beanList);
		System.out.println("Bean List:" + beanListString);
		assertEquals("[{\"name\":\"A\"},{\"name\":\"B\"}]", beanListString);

		//Bean[]
		TestBean[] beanArray = new TestBean[] { new TestBean("A"), new TestBean("B") };
		String beanArrayString = binder.toJson(beanArray);
		System.out.println("Array List:" + beanArrayString);
		assertEquals("[{\"name\":\"A\"},{\"name\":\"B\"}]", beanArrayString);
	}

	/**
	 * 从Json字符串反序列化对象/集合.
	 */
	@Test
	@SuppressWarnings("unchecked")
	public void fromJson() throws Exception {
		//Bean
		String beanString = "{\"name\":\"A\"}";
		TestBean bean = binder.fromJson(beanString, TestBean.class);
		System.out.println("Bean:" + bean);

		//Map
		String mapString = "{\"name\":\"A\",\"age\":2}";
		Map<String, Object> map = binder.fromJson(mapString, HashMap.class);
		System.out.println("Map:");
		for (Entry<String, Object> entry : map.entrySet()) {
			System.out.println(entry.getKey() + " " + entry.getValue());
		}

		//List<String>
		String listString = "[\"A\",\"B\",\"C\"]";
		List<String> stringList = binder.getMapper().readValue(listString, List.class);
		System.out.println("String List:");
		for (String element : stringList) {
			System.out.println(element);
		}

		//List<Bean>
		String beanListString = "[{\"name\":\"A\"},{\"name\":\"B\"}]";
		List<TestBean> beanList = binder.getMapper().readValue(beanListString, new TypeReference<List<TestBean>>() {
		});
		System.out.println("Bean List:");
		for (TestBean element : beanList) {
			System.out.println(element);
		}
	}


在我的实际项目中,遇到一个有意思的问题,我把一个对象转为为json字符串时,调用binder.toJson(bean) ,这个方法,方法总是返回null,后面发现该bean中没有默认的构造函数,加上某人构造函数就ok了

以上部分转载来自于:http://zhangyou1010.iteye.com/blog/1049259

以下是参考人家的,自己写的部分:
/**
* 利用 Jackson 中的 {@link ObjectMapper} 类来让 java 对象和 json 字符串实现互相转换. 在某些场合下将 java 对象转换为 json
* 字符串有很多好处, 比如往缓存中存放数据. 可以看作是对 Jackson 的简单封装, 也可以通过 {@link #getObjectMapper()}
* 方法获得<code>objectMapper</code> 对象来完成其他操作. 为了获得更好的效率, 采用了 singleton 模式, jackson 对此是支持的.
*
* @author
*/
public class JsonBinder {
	
	private static ObjectMapper objectMapper = new ObjectMapper();
	
	private static JsonBinder jsonBinder;
	
	private JsonBinder(Inclusion inclusion) {
		// serializing 设置成 Inclusion.NON_DEFAULT 来提高性能
		objectMapper.getSerializationConfig().withSerializationInclusion(inclusion);
	}
	
	/**
	 * 允许修改 {@link Inclusion}, 默认是 {@link Inclusion#NON_DEFAULT}, 也即对于未修改的属性不用进行 json 转换.
	 * 
	 * @param inclusion
	 * @see #getInstance()
	 */
	public static JsonBinder getInstance(Inclusion inclusion) {
		if (jsonBinder == null) {
			jsonBinder = new JsonBinder(inclusion);
		}
		return jsonBinder;
	}
	
	public static JsonBinder getInstance() {
		if (jsonBinder == null) {
			jsonBinder = new JsonBinder(Inclusion.NON_DEFAULT);
		}
		return jsonBinder;
	}
	
	/**
	 * 从 json 字符串生成相应的 java 对象.
	 * <ul>
	 *     <li>1) 如果 JSON 字符串为 NULL 或 "null", 则返回 null.</li>
	 *     <li>2) 如果 JSON 字符串为 "[]", 则返回空集合.</li>
	 * </ul>
	 * 
	 * @param <T>
	 * @param jsonString
	 * @param clazz
	 * @return
	 */
	public <T> T fromJson(String jsonString, Class<T> clazz) {
		if (StringUtils.isEmpty(jsonString)) {
			return null;
		}
		try {
			return objectMapper.readValue(jsonString, clazz);
		} catch (IOException e) {
			return null;
		}
	}
	
	/**
	 * 将 java 对象生成 json 格式.
	 * <ul>
	 *     <li>1) 如果对象为 null, 则返回 "null".</li>
	 *     <li>2) 如果对象为空集合, 则返回 "[]".</li>
	 * </ul>
	 * 
	 * @param object
	 * @return
	 */
	public String toJson(Object object) {
		try {
			return objectMapper.writeValueAsString(object);
		} catch (IOException e) {
			return null;
		}
	}
	
	/**
	 * 获取 <code>objectMapper</code> 对象, 完成其他该 binder 未封装的功能.
	 * 
	 * @return
	 */
	public ObjectMapper getObjectMapper() {
		return objectMapper;
	}
}[/size][/color]
分享到:
评论

相关推荐

    json 转化工具类

    在Java编程中,我们经常需要将JSON字符串转化为Java对象,或者将Java对象转化为JSON字符串,这时就需要用到JSON转化工具类。这个"json 转化工具类"就是为了解决这样的问题。 在Java中,有很多流行的库可以处理JSON...

    net.sf.json.JSONObject实现Object对象与Json字符串的互转

    在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛用于前后端数据传输。`net.sf.json.JSONObject`是开源库Apache Commons Lang中的一个类,它提供了解决Java对象与JSON字符串...

    json和java互转测试项目

    `json-lib`库提供了一套完整的API,可以方便地将Java的Map、ArrayList、自定义对象等转换为JSON格式,同时也能将JSON文本解析回对应的Java对象。 以下是一些关键知识点: 1. **安装和引入**:首先,你需要将`json-...

    jackson2.2.3

    通过在Java类和字段上添加注解,开发者可以指定哪些字段应被包括或排除,如何处理日期、枚举等复杂类型,以及如何处理循环引用等问题。常见的注解有`@JsonProperty`、`@JsonIgnore`、`@JsonInclude`、`@JsonFormat`...

    json-lib-2.4-jdk15.jar

    1. **JSON到Java对象转换**:`json-lib`允许开发者将JSON字符串解析为Java对象,如Map、List、数组等。这通常通过`JSONArray`和`JSONObject`类实现。 2. **Java对象到JSON转换**:同样,它也可以将Java对象转化为...

    json-lib-2.4(2013.6.13前最新版本)选定版

    这个版本提供了对JSON对象与Java对象之间相互转换的功能,使得开发者可以轻松地在JSON字符串和Java的Map、List、数组等数据结构间进行操作。它支持多种JVM环境,包括JDK1.5,这从压缩包中的`json-lib-2.4-jdk15.jar`...

    json-lib-2.4JAR包

    4. **支持多种类型的数据**:json-lib可以处理包括基本类型、数组、列表、Map、日期、枚举等多种Java数据类型,并能自动处理它们的JSON表示。 5. **性能优化**:考虑到性能,json-lib在设计时进行了优化,能够高效...

    Json对象转换

    Jackson可以处理数组、列表、Map和其他复杂类型的转换。例如,如果`User`类有一个`List&lt;Address&gt;`字段,只需确保`Address`类也有相应的getter和setter。 5. **使用`@JsonProperty`和`@JsonPropertyAnnotation`**:...

    fastjson jar包 和 api

    Fastjson支持List、Map等集合与JSON数组之间的转换,例如`parseArray(String jsonString, Class&lt;T&gt; clazz)`用于将JSON数组解析为Java集合,`JSONArray.toJSONArray(List&lt;T&gt; list)`则可以将Java集合转化为JSONArray。...

    Json-lib-2.4.jdk15.jar

    1. **JSON到Java对象的序列化**:Json-lib可以将JSON格式的数据解析为Java对象,如Map、List、数组、自定义类等,这样开发者可以方便地处理JSON数据。 2. **Java对象到JSON的反序列化**:同样,Json-lib也可以将...

    快速json处理 fastjson-1.2.13

    - 从字符串解析为Java对象:Fastjson提供`JSON.parseObject()`方法,可以将JSON字符串转换成Java对象,如Map、List或自定义类实例。 - 从JSON流解析:支持从InputStream、Reader等输入流解析JSON数据。 2. **...

    json要导的jar包

    4. Fastjson:阿里巴巴开发的高性能的JSON库,支持Java Bean、Map、List等类型的JSON转换,提供了极简的API,性能优秀,适用于对速度有高要求的场景。 这些JAR包的使用通常涉及到以下步骤: 1. 将所需的JAR文件添加...

    jackson的jar包

    3. **类型绑定**: Jackson支持多种复杂的类型转换,如日期、枚举、自定义类型等。例如,使用`@JsonFormat`可以指定日期格式,`@JsonDeserialize`和`@JsonSerialize`可以自定义序列化和反序列化逻辑。 4. **集合和...

    FastJson应用案例.txt

    2. **兼容性好**:FastJson对Java的各种数据类型都有良好的支持,包括Class、Collection、Map、Date、Enum等常见的Java数据类型。 3. **简单易用**:提供了一套简洁的API接口,便于开发者快速上手并实现JSON数据的...

    josn 各种转换

    Jackson支持嵌套的JSON对象和数组,对应的Java对象可以是复杂的类结构,包括List、Map以及其他Java集合。 5. 避免无限递归 在处理包含相互引用的对象时,可能会导致无限递归。可以使用`@JsonIdentityInfo`注解解决...

    fastjson使用

    - `JSONObject.parseObject(String jsonString, Map, Object&gt; map)`:将JSON字符串解析为Map对象。 - `JSONObject.toJSONString(Map, Object&gt; map)`:将Map对象转换为JSON字符串。 4. **自定义转换规则** - ...

    浅谈fastjson的常用使用方法

    2. 强大:它能够支持任意的JavaBean以及包括集合、Map、日期和枚举等类的序列化和反序列化。 3. 零依赖:除了JDK,它不依赖其他任何类库。 在Fastjson中常用的几个类及其用途如下: - `JSON`:这是Fastjson中的...

    20个常用的ava程序片段.doc

    - JSON库如Gson或Jackson可以方便地将Java对象转换为JSON字符串,反之亦然。 19. **正则表达式匹配**: - `Pattern.compile()`和`Matcher`类用于处理正则表达式,进行文本匹配和查找。 20. **并发工具类**: - ...

    Vue请求java服务端并返回数据代码实例

    在现代Web应用开发中,前端框架...同时,Java服务端可能会使用更复杂的对象模型,以及使用如Jackson或Gson库来自动序列化和反序列化JSON数据。理解这一基础交互流程,对于开发Vue.js与Java服务端结合的应用至关重要。

Global site tag (gtag.js) - Google Analytics