`
53873039oycg
  • 浏览: 837347 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

使用Jackson转换JavaBean遇到的问题

 
阅读更多

    今天想试一下Jackson与JavaBean之间的相互转换效果,写了个简单的例子,如下所示:

   

package com.huse.java.xmljson;
import java.util.Date;
import org.codehaus.jackson.map.annotate.JsonDeserialize;
import org.codehaus.jackson.map.annotate.JsonSerialize;

 public class DateBeanTest {
	public String toString() {
		return "DateBeanTest [name=" + name + ", sqlDate="
				+ sqlDate.toLocaleString() + ", ctime="
				+ ctime.toLocaleString() + "]";
	}

	private String name;
	private java.sql.Date sqlDate;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public DateBeanTest(String name, java.sql.Date sqlDate, Date ctime) {
		super();
		this.name = name;
		this.sqlDate = sqlDate;
		this.ctime = ctime;
	}

	public DateBeanTest() {
		super();
	}

	@JsonDeserialize(using = CustomSqlDateDeSerializer.class)
	public void setSqlDate(java.sql.Date sqlDate) {
		this.sqlDate = sqlDate;
	}

	@JsonDeserialize(using = CustomUtilDateDeSerializer.class)
	public void setCtime(Date ctime) {
		this.ctime = ctime;
	}

	private Date ctime;

	@JsonSerialize(using = CustomUtilDateSerializer.class)
	public Date getCtime() {
		return ctime;
	}

	@JsonSerialize(using = CustomSqlDateSerializer.class)
	public java.sql.Date getSqlDate() {
		return sqlDate;
	}
}

    转换器如下:

package com.huse.java.xmljson;

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;

/**
 * java日期对象经过Jackson库转换成JSON日期格式化自定义类
 * 
 * @author godfox
 * @date 2010-5-3
 */
public class CustomUtilDateSerializer extends JsonSerializer<Date> {

	public void serialize(Date value, JsonGenerator jgen,
			SerializerProvider provider) throws IOException,
			JsonProcessingException {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		String formattedDate = formatter.format(value);
		jgen.writeString(formattedDate);
	}

}

  

package com.huse.java.xmljson;

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

import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;

public class CustomUtilDateDeSerializer extends JsonDeserializer<Date> {
	public Date deserialize(JsonParser jsonparser,
			DeserializationContext deserializationcontext) throws IOException,
			JsonProcessingException {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		Date date = null;
		try {
			date = formatter.parse(jsonparser.getText());
		} catch (ParseException e) {
			date = new Date(jsonparser.getLongValue());
		}
		return date;
	}
}

   Jackson转换JavaBean方法如下:

  

package com.huse.java.xmljson;

import java.io.StringWriter;

import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonHelper {
	private static JacksonHelper jsonUtil;
	private static JsonFactory jsonFactory;
	private static ObjectMapper objectMapper;

	private JacksonHelper() {

	}

	public static JacksonHelper getInstance() {
		if (jsonUtil == null)
			jsonUtil = new JacksonHelper();
		return jsonUtil;
	}

	public static ObjectMapper getMapper() {
		if (objectMapper == null) {
			objectMapper = new ObjectMapper();
		}
		return objectMapper;
	}

	public static JsonFactory getFactory() {
		if (jsonFactory == null)
			jsonFactory = new JsonFactory();
		return jsonFactory;
	}

	public void obj2jsonSysOut(Object obj) {
		JsonGenerator jsonGenerator = null;
		JsonFactory jf = null;
		try {
			objectMapper = getMapper();
			//StringWriter out = new StringWriter();
			jf = objectMapper.getJsonFactory();
			jsonGenerator = jf.createJsonGenerator(System.out,
					JsonEncoding.UTF8);
			objectMapper.writeValue(jsonGenerator, obj);
			//jsonGenerator = jf.createJsonGenerator(out);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (jsonGenerator != null) {
					jsonGenerator.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

	public String obj2json(Object obj) {
		try {
			objectMapper = getMapper();
			return objectMapper.writeValueAsString(obj);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public Object json2obj(String json, Class<?> clz) {
		try {
			objectMapper = getMapper();
			return objectMapper.readValue(json, clz);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

}

 

   测试方法为:

 

package com.huse.java.xmljson;

import java.util.Date;

public class JacksonDateBeanTest {
	public static void main(String[] args) {
		DateBeanTest t1=new DateBeanTest("test", new java.sql.Date(System.currentTimeMillis()), new Date());
		JacksonHelper jHelper=JacksonHelper.getInstance();
	    jHelper.obj2jsonSysOut(t1);
	    System.out.println();
		String str=jHelper.obj2json(t1);
		DateBeanTest t3=(DateBeanTest) jHelper.json2obj(str, DateBeanTest.class);
		System.out.println(t3);
	}
}

 

     运行结果为:

{"name":"test","sqlDate":"2013-12-26","ctime":"2013-12-26"}

     很奇怪,为什么没打印Json转换为JavaBean的结果,试着打了几个断点看下,发现程序正常运行结束,没有中途出错,开始怀疑是不是使用了静态变量设置System.out输出后没改回来,修改代码为:

   

public void obj2jsonSysOut(Object obj) {
		JsonGenerator jsonGenerator = null;
		JsonFactory jf = null;
		try {
			objectMapper = getMapper();
			StringWriter out = new StringWriter();
			jf = objectMapper.getJsonFactory();
			jsonGenerator = jf.createJsonGenerator(System.out,
					JsonEncoding.UTF8);
			objectMapper.writeValue(jsonGenerator, obj);
			jsonGenerator = jf.createJsonGenerator(out);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (jsonGenerator != null) {
					jsonGenerator.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

    运行结果为:

    

{"name":"test","sqlDate":"2013-12-26","ctime":"2013-12-26"}
DateBeanTest [name=test, sqlDate=2013-12-26 0:00:00, ctime=2013-12-26 0:00:00]

   ps,但我obj2json设置输出为StringWrite为什么没起作用呢?

 

 

 

 

分享到:
评论

相关推荐

    javabean和json互转所需包

    4. 如果需要从JSON字符串反序列化回JavaBean,可以使用`JsonParserFactory`创建`JsonParser`,然后调用其方法将JSON字符串解析成JSON对象,再进一步转换为JavaBean。 例如,一个简单的JavaBean转换为JSON的示例代码...

    json与bean的转换

    在项目中,我们通常会使用`Jackson`或`Gson`这样的现代库来处理JSON与Java对象的转换,因为它们提供了更丰富的功能和更好的性能。然而,了解如何使用JSON-lib进行转换仍然是有价值的,尤其是在处理旧代码或特定场景...

    使用第三方工具将各种对象转成json格式

    在转换过程中,可能遇到如空指针异常、类型不匹配等问题,需要进行异常处理。此外,为了提高性能,可以考虑启用库的缓存机制,减少不必要的序列化和反序列化操作。 7. **总结** 将Java对象转换为JSON格式是常见的...

    json-lib共7个包.rar

    6. 转换JavaBean:如果需要处理JavaBean,`commons-beanutils`能帮助你便捷地访问和修改Bean的属性。 在开发过程中,需要注意的是,虽然`json-lib`是一个强大的工具,但它可能不如一些现代的JSON库(如Jackson、...

    json所用到的Jar包

    例如,你可能首先使用json-lib将JSON字符串解析为一个JSON对象,然后利用commons-beanutils将这个JSON对象映射到一个JavaBean,如果需要进一步处理,EZMorph可以用来转换JavaBean的属性类型。 在使用这些库时,需要...

    Java中json与javaBean几种互转的讲解

    使用org.json库进行Java对象与JSON字符串转换时,需要注意几个问题: - 在定义JSON格式的字符串时,要对双引号进行转义,因为在JSON字符串中双引号是有特殊意义的字符。 - 在转换过程中,确保所有字段名和字段类型...

    生成json串

    如果你在处理过程中遇到问题,可以查阅相关库的官方文档,或者在Stack Overflow等开发者社区寻找解决方案。记住,实践是检验理解和技能的最好方式,多编写和运行代码,你将对JSON处理有更深的理解。

    在JAVA中使用JSON 的jar包

    在实际项目中,你可能还会遇到处理嵌套JSON结构、日期格式化、自定义转换规则等问题,`json-lib`都提供了相应的解决方案。但需要注意的是,随着技术的发展,更现代的JSON库如Jackson、Gson和Fastjson已经逐渐取代了`...

    json java读取 formbean操作

    - **异常处理**:在读取JSON时,可能会遇到JSON格式错误等问题,应捕获并处理`JsonParseException`或类似的异常。 - **JSON Path**:对于复杂JSON结构,可以使用JSON Path表达式来提取特定的数据,如使用Jackson的`...

    JSON-lib

    8. **错误处理**:在解析JSON数据或转换Java对象时,可能会遇到格式错误或其他异常。JSON-lib会抛出`JSONException`,开发者需要捕获并处理这些异常,以确保程序的健壮性。 总的来说,JSON-lib是一个全面的JSON处理...

    json工具包和js

    FastJSON是阿里巴巴开发的JSON解析库,它的性能非常高,支持JavaBean、Map、Collection等类型的JSON转换。FastJSON的使用非常直观,如`JSON.parseObject()`和`JSON.toJSONString()`分别用于JSON字符串到Java对象的...

    各种对象转成JSON字符串.docx

    在IT行业中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式...在实际项目中,可以考虑使用更强大的库,如Jackson、Gson或Google的Protocol Buffers,它们提供了更全面且高效的序列化和反序列化功能。

    JSONObject 使用到的jar

    在实际开发中,你可能还会遇到需要与其他数据类型(如JavaBean、List、Map等)相互转换的情况。这时,你可以借助第三方库,如Gson或Jackson,它们提供了更强大的转换功能。但是,对于简单的JSON操作,`org.json` 库...

    Json的jar包

    在处理JSON时,可能会遇到需要将各种类型的数据转换成JSON兼容格式的情况,这时EZMorph就派上用场了。 6. **commons-logging-1.1.1.jar**:Apache Commons Logging是一个日志抽象层,它允许应用程序选择任何实现...

    java json api,json api

    例如,对于一个JavaBean,你可以使用`JSONUtils.toJSON(yourBean)`将其转换为JSON对象,然后用`JSONUtils.fromObject(jsonObj, YourBeanClass.class)`将其转换回来。 4. **JSON与XML的互转**:`json-lib`还提供了将...

    Java中JSON应用

    3. `commons-beanutils-core-1.7.0.jar`:Apache Commons BeanUtils,提供了一种简单的方式来操作JavaBeans属性,这在将JavaBean对象转换为JSON时非常有用。 4. `commons-logging-1.0.4.jar`:Apache Commons ...

    SpringMVC restful 注解之@RequestBody进行json与object转换

    然而,在尝试使用`@RequestBody`注解并调用服务时遇到了问题。开发者首先怀疑可能是Spring没有正确加载`MappingJackson2HttpMessageConverter`,或者加载后没有正常工作。为了验证这个假设,他们尝试自定义配置以...

    看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇

    Jackson库同样支持将Java对象与JSON字符串之间的转换。与Gson不同的是,Jackson不会反序列化非公开属性,除非提供了相应的setter、getter方法或使用了特定的注解。这种设计在一定程度上减少了安全风险。同时,...

    json需要用到的包

    4. **commons-beanutils-1.8.3.jar**:Apache Commons BeanUtils库简化了JavaBean对象的使用,提供了一种简单的方式来访问和操作对象属性。在处理JSON到Java对象的映射时,它可以帮助我们便捷地处理Bean对象。 5. *...

    jsno解析

    5. 错误处理:解析过程中可能会遇到格式错误、类型不匹配等问题,博客可能会讲解如何处理这些问题。 6. 性能优化:对于大量数据的处理,性能是关键。博客可能涉及如何优化JSON解析的性能,例如使用流式API或预编译...

Global site tag (gtag.js) - Google Analytics