使用Jackson 如何把json字符串反序列化为List呢?
(List中是自定义对象)
先看下常规的反序列化:
- @Test
- publicvoid test_reserialize(){
- String jsonInput = "{\"addrr\":{\"country\":\"中国\",\"state\":\"湖北省\",\"street\":\"清河\"},\"age\":25,\"hobby\":\"\",\"name\":\"黄威\"}";
- ObjectMapper mapper = new ObjectMapper();
- Student student;
- try {
- student = mapper.readValue(jsonInput, Student.class);
- System.out.println(student.getAddrr().getStreet());
- System.out.println(student.getName());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
@Test public void test_reserialize(){ String jsonInput = "{\"addrr\":{\"country\":\"中国\",\"state\":\"湖北省\",\"street\":\"清河\"},\"age\":25,\"hobby\":\"\",\"name\":\"黄威\"}"; ObjectMapper mapper = new ObjectMapper(); Student student; try { student = mapper.readValue(jsonInput, Student.class); System.out.println(student.getAddrr().getStreet()); System.out.println(student.getName()); } catch (Exception e) { e.printStackTrace(); } }
运行结果:
序列化
- @Test
- publicvoid test_004(){
- List<Teacher> list=new ArrayList<Teacher>();
- Teacher t=new Teacher();
- t.setId(2);
- t.setName("雄鹰表");
- t.setTitle("aa");
- list.add(t);
- t=new Teacher();
- t.setId(3);
- t.setName("陈定生");
- t.setTitle("bb");
- list.add(t);
- t=new Teacher();
- t.setId(4);
- t.setName("张阿勇");
- t.setTitle("cc");
- list.add(t);
- ObjectMapper mapper = new ObjectMapper();
- String content;
- try {
- content = mapper.writeValueAsString(list);
- System.out.println(content);
- } catch (JsonGenerationException e) {
- e.printStackTrace();
- } catch (JsonMappingException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
@Test public void test_004(){ List<Teacher> list=new ArrayList<Teacher>(); Teacher t=new Teacher(); t.setId(2); t.setName("雄鹰表"); t.setTitle("aa"); list.add(t); t=new Teacher(); t.setId(3); t.setName("陈定生"); t.setTitle("bb"); list.add(t); t=new Teacher(); t.setId(4); t.setName("张阿勇"); t.setTitle("cc"); list.add(t); ObjectMapper mapper = new ObjectMapper(); String content; try { content = mapper.writeValueAsString(list); System.out.println(content); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
运行结果:
[{“id”:2,”title”:”aa”,”name”:”雄鹰表”},{“id”:3,”title”:”bb”,”name”:”陈定生”},{“id”:4,”title”:”cc”,”name”:”张阿勇”}]
反序列化
把上述json字符串反序列化为List
代码如下:
- @Test
- publicvoid test_006(){
- String jsonInput="[{\"id\":2,\"title\":\"aa\",\"name\":\"雄鹰表\"},{\"id\":3,\"title\":\"bb\",\"name\":\"陈定生\"},{\"id\":4,\"title\":\"cc\",\"name\":\"张阿勇\"}]";
- ObjectMapper mapper = new ObjectMapper();
- List student;
- try {
- student = mapper.readValue(jsonInput, List.class);
- System.out.println(student.size());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
@Test public void test_006(){ String jsonInput="[{\"id\":2,\"title\":\"aa\",\"name\":\"雄鹰表\"},{\"id\":3,\"title\":\"bb\",\"name\":\"陈定生\"},{\"id\":4,\"title\":\"cc\",\"name\":\"张阿勇\"}]"; ObjectMapper mapper = new ObjectMapper(); List student; try { student = mapper.readValue(jsonInput, List.class); System.out.println(student.size()); } catch (Exception e) { e.printStackTrace(); } }
运行时
没有达到预期效果,虽然反序列化成了List,但是并不是List<Teacher>,而是List<HashMap>
如何解决这个问题呢?
解决方法:使用mapper.getTypeFactory().constructParametricType
- /**
- * 获取泛型的Collection Type
- * @param collectionClass 泛型的Collection
- * @param elementClasses 元素类
- * @return JavaType Java类型
- * @since 1.0
- */
- publicstatic JavaType getCollectionType(ObjectMapper mapper,Class<?> collectionClass, Class<?>... elementClasses) {
- return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
- }
- @Test
- publicvoid test_006(){
- String jsonInput="[{\"id\":2,\"title\":\"aa\",\"name\":\"雄鹰表\"},{\"id\":3,\"title\":\"bb\",\"name\":\"陈定生\"},{\"id\":4,\"title\":\"cc\",\"name\":\"张阿勇\"}]";
- ObjectMapper mapper = new ObjectMapper();
- List student;
- try {
- student = mapper.readValue(jsonInput, getCollectionType(mapper, List.class, Teacher.class));
- System.out.println(student.size());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
/** * 获取泛型的Collection Type * @param collectionClass 泛型的Collection * @param elementClasses 元素类 * @return JavaType Java类型 * @since 1.0 */ public static JavaType getCollectionType(ObjectMapper mapper,Class<?> collectionClass, Class<?>... elementClasses) { return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses); } @Test public void test_006(){ String jsonInput="[{\"id\":2,\"title\":\"aa\",\"name\":\"雄鹰表\"},{\"id\":3,\"title\":\"bb\",\"name\":\"陈定生\"},{\"id\":4,\"title\":\"cc\",\"name\":\"张阿勇\"}]"; ObjectMapper mapper = new ObjectMapper(); List student; try { student = mapper.readValue(jsonInput, getCollectionType(mapper, List.class, Teacher.class)); System.out.println(student.size()); } catch (Exception e) { e.printStackTrace(); } }
运行时:
http://blog.csdn.net/hw1287789687/article/details/46955179
作者:黄威
联系方式:1287789687@qq.com
相关推荐
在标题“Jackson对象json字符串数组集合互转”中,提到的核心概念是Jackson如何处理JSON字符串与Java集合(如List、Array等)之间的转换。下面将详细解释这一过程以及涉及的相关知识点。 1. JSON与Java对象映射: ...
除了序列化,`json-lib`还支持反序列化,即将JSON字符串转换回Java对象: ```java Person deserializedPerson = (Person) JSONSerializer.toJava(jsonString); ``` 6. JSONPath和JSONSchema: 在实际应用中,...
在Java中,将JSON字符串转换为Map或List是常见的操作,这在处理服务器返回的数据或者进行数据序列化时非常有用。 JSON字符串的结构主要包括对象(键值对的集合,用花括号{}包围)和数组(有序元素的集合,用方括号...
现在,我们可以使用Jackson库的`ObjectMapper`类将JSON字符串转换为Java对象: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class JsonParser { public static void main(String[] args...
JSON字符串到Java对象的转换通常通过反序列化实现,而Java对象到JSON字符串的转换则称为序列化。 - json-lib库提供了一套API,使得这种转换变得简单。例如,使用`net.sf.json.JSONObject.fromObject()`方法可以将...
除了解析JSON字符串到Java对象,这两个库还支持将Java对象转换为JSON字符串,以及解析JSON到Map或List等数据结构。 3. **其他库** 除了Jackson和Gson,还有其他的JSON处理库,如org.json(提供简单的JSON工具类)...
然后,我们可以使用`ObjectMapper`的`readValue()`方法,传入JSON字符串和之前构建的`JavaType`,来反序列化JSON字符串为泛型的`List<YourBean>`: ```java List<YourBean> lst = (List) mapper.readValue(json...
将JSON字符串反序列化为Java对象: ```java Person person = gson.fromJson(jsonString, Person.class); ``` 2. **Jackson转换:** Jackson是另一个流行的JSON处理库,提供了更丰富的功能和更好的性能。同样...
在这个真实案例中,我们将深入探讨如何使用Gson库来解析复杂的JSON字符串。 Gson是Google提供的一个Java库,它能够将Java对象转换为JSON字符串,反之亦然。在解析复杂的JSON字符串时,Gson提供了强大的功能,包括对...
本篇将详细介绍如何利用Jackson包进行JSON字符串与POJO(Plain Old Java Object)类之间的转换,并探讨相关源码。 Jackson库主要包括三个核心模块:`jackson-core`、`jackson-annotations`和`jackson-databind`。在...
在JSON到Java对象的转换中,Jackson允许我们将JSON字符串解析成Java对象,包括列表(List)和映射(Map)。对于复杂列表,这意味着列表中的每个元素可能是一个复杂的Java对象,包含了嵌套的对象或者列表。例如,一个用户...
在Spring Boot应用中,ObjectMapper是Jackson库的核心组件,它被广泛用于处理JSON数据,包括序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象)。这个强大的工具使得在Spring Boot工程...
这个“json转化字符串案例”应该是提供了一些示例,演示如何将Java对象转化为JSON字符串,以及如何将JSON字符串反序列化为Java对象。这对于理解和学习JSON在Java环境中的应用至关重要,特别是对于初学者来说。 首先...
在Spring中,我们通常会使用`Jackson.databind`模块,因为它提供了`ObjectMapper`类,可以方便地将Java对象转换为JSON字符串,反之亦然。为了集成Jackson,首先需要在项目中引入对应的依赖。对于Maven项目,可以在...
在Java编程中,处理JSON数据时,Jackson是一个非常流行的开源工具包,它提供了将Java对象转换为JSON字符串以及从JSON字符串反序列化回Java对象的功能。 Jackson库由FasterXML公司开发,其主要组件包括`Jackson-...
下面是一个示例代码,演示如何使用 ObjectMapper 将 JSON 字符串转换为 Map,同时启用 USE_BIG_DECIMAL_FOR_FLOATS 选项以解决科学计数法的问题: ```java ObjectMapper mapper = new ObjectMapper(); mapper....
然后,我们使用`JSONArray`的`fromObject()`方法将`list`转换为JSON字符串。在没有特殊配置的情况下,JSON字符串中的日期会显示为服务器本地的日期时间格式,而非我们希望的人性化的日期格式。 为了解决这个问题,...
在描述中提到的问题是,当我们尝试将JSON字符串反序列化为Java的List对象集合时,如果没有指定确切的类类型,Jackson可能会将列表中的对象反序列化为LinkedHashMap。这是因为JSON中的键值对默认映射到了Map结构。当...
JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在网络间传输或者保存在文件系统中。本篇文章将深入探讨Java中JSON的序列化与反序列化,以及相关的工具库。 一、JSON概述 ...
将Java对象转换为JSON字符串同样使用`ObjectMapper`: ```java Person p = new Person("张三", 30, "北京"); String jsonString = mapper.writeValueAsString(p); ``` 三、特殊类型转换 1. 集合和数组 对于List、Set...