今天想试一下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为什么没起作用呢?
相关推荐
4. 如果需要从JSON字符串反序列化回JavaBean,可以使用`JsonParserFactory`创建`JsonParser`,然后调用其方法将JSON字符串解析成JSON对象,再进一步转换为JavaBean。 例如,一个简单的JavaBean转换为JSON的示例代码...
在项目中,我们通常会使用`Jackson`或`Gson`这样的现代库来处理JSON与Java对象的转换,因为它们提供了更丰富的功能和更好的性能。然而,了解如何使用JSON-lib进行转换仍然是有价值的,尤其是在处理旧代码或特定场景...
在转换过程中,可能遇到如空指针异常、类型不匹配等问题,需要进行异常处理。此外,为了提高性能,可以考虑启用库的缓存机制,减少不必要的序列化和反序列化操作。 7. **总结** 将Java对象转换为JSON格式是常见的...
6. 转换JavaBean:如果需要处理JavaBean,`commons-beanutils`能帮助你便捷地访问和修改Bean的属性。 在开发过程中,需要注意的是,虽然`json-lib`是一个强大的工具,但它可能不如一些现代的JSON库(如Jackson、...
例如,你可能首先使用json-lib将JSON字符串解析为一个JSON对象,然后利用commons-beanutils将这个JSON对象映射到一个JavaBean,如果需要进一步处理,EZMorph可以用来转换JavaBean的属性类型。 在使用这些库时,需要...
使用org.json库进行Java对象与JSON字符串转换时,需要注意几个问题: - 在定义JSON格式的字符串时,要对双引号进行转义,因为在JSON字符串中双引号是有特殊意义的字符。 - 在转换过程中,确保所有字段名和字段类型...
如果你在处理过程中遇到问题,可以查阅相关库的官方文档,或者在Stack Overflow等开发者社区寻找解决方案。记住,实践是检验理解和技能的最好方式,多编写和运行代码,你将对JSON处理有更深的理解。
在实际项目中,你可能还会遇到处理嵌套JSON结构、日期格式化、自定义转换规则等问题,`json-lib`都提供了相应的解决方案。但需要注意的是,随着技术的发展,更现代的JSON库如Jackson、Gson和Fastjson已经逐渐取代了`...
- **异常处理**:在读取JSON时,可能会遇到JSON格式错误等问题,应捕获并处理`JsonParseException`或类似的异常。 - **JSON Path**:对于复杂JSON结构,可以使用JSON Path表达式来提取特定的数据,如使用Jackson的`...
8. **错误处理**:在解析JSON数据或转换Java对象时,可能会遇到格式错误或其他异常。JSON-lib会抛出`JSONException`,开发者需要捕获并处理这些异常,以确保程序的健壮性。 总的来说,JSON-lib是一个全面的JSON处理...
FastJSON是阿里巴巴开发的JSON解析库,它的性能非常高,支持JavaBean、Map、Collection等类型的JSON转换。FastJSON的使用非常直观,如`JSON.parseObject()`和`JSON.toJSONString()`分别用于JSON字符串到Java对象的...
在IT行业中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式...在实际项目中,可以考虑使用更强大的库,如Jackson、Gson或Google的Protocol Buffers,它们提供了更全面且高效的序列化和反序列化功能。
在实际开发中,你可能还会遇到需要与其他数据类型(如JavaBean、List、Map等)相互转换的情况。这时,你可以借助第三方库,如Gson或Jackson,它们提供了更强大的转换功能。但是,对于简单的JSON操作,`org.json` 库...
在处理JSON时,可能会遇到需要将各种类型的数据转换成JSON兼容格式的情况,这时EZMorph就派上用场了。 6. **commons-logging-1.1.1.jar**:Apache Commons Logging是一个日志抽象层,它允许应用程序选择任何实现...
例如,对于一个JavaBean,你可以使用`JSONUtils.toJSON(yourBean)`将其转换为JSON对象,然后用`JSONUtils.fromObject(jsonObj, YourBeanClass.class)`将其转换回来。 4. **JSON与XML的互转**:`json-lib`还提供了将...
3. `commons-beanutils-core-1.7.0.jar`:Apache Commons BeanUtils,提供了一种简单的方式来操作JavaBeans属性,这在将JavaBean对象转换为JSON时非常有用。 4. `commons-logging-1.0.4.jar`:Apache Commons ...
然而,在尝试使用`@RequestBody`注解并调用服务时遇到了问题。开发者首先怀疑可能是Spring没有正确加载`MappingJackson2HttpMessageConverter`,或者加载后没有正常工作。为了验证这个假设,他们尝试自定义配置以...
Jackson库同样支持将Java对象与JSON字符串之间的转换。与Gson不同的是,Jackson不会反序列化非公开属性,除非提供了相应的setter、getter方法或使用了特定的注解。这种设计在一定程度上减少了安全风险。同时,...
4. **commons-beanutils-1.8.3.jar**:Apache Commons BeanUtils库简化了JavaBean对象的使用,提供了一种简单的方式来访问和操作对象属性。在处理JSON到Java对象的映射时,它可以帮助我们便捷地处理Bean对象。 5. *...
5. 错误处理:解析过程中可能会遇到格式错误、类型不匹配等问题,博客可能会讲解如何处理这些问题。 6. 性能优化:对于大量数据的处理,性能是关键。博客可能涉及如何优化JSON解析的性能,例如使用流式API或预编译...