使用ObjectMapper对含有任意key的JSON进行反序列化
在调用某个RESTful API后,返回的JSON字符串中含有没有预先定义的key,和结构固定的JSON相比,它需要一些额外的操作。
对于结构固定的JSON,使用ObjectMapper结合某个预先定义的实体类型可以非常方便地完成反序列化工作,比如对下面这样的JSON:
GET /person/1
{
"id": "1",
"name": "dm_vincent",
"age": "28"
}
结合一个实体类型,可以很轻松的完成反序列化工作:
public class Person {
public long id;
public String name;
public int age;
}
public static <T> T getEntity(String jsonString, Class<T> prototype) {
ObjectMapper objectMapper = new ObjectMapper();
try {
return (T) objectMapper.readValue(jsonString, prototype);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
但是在某些支持一次性获取多条记录的API中,就出现问题了。比如拥有下面这种格式的API:
GET /person/1,2,3
{
"dm_vincent": {
"id": "1",
"name": "dm_vincent",
"age": "28"
},
"dm_vincent2": {
"id": "2",
"name": "dm_vincent2",
"age": "29"
},
"dm_vincent3": {
"id": "3",
"name": "dm_vincent3",
"age": "30"
}
}
虽然需要获取的实体类型还是那个Person类,可是这个时候就不像上面那样简单明了了。比如下面这段代码在反序列化的时候会出现问题:
public class PersonWrapper {
public Map<String, Person> persons;
}
我们的意图是明确的,将返回的多个Person实体对象放到一个Map结构中。但是问题就在于返回的JSON中的keys是不固定的(比如上述JSON中的keys是人名),这导致反序列化失败。毕竟默认配置下的ObjectMapper也没有聪明到这种程度,能够猜测你是想要将多个实体放到Map中。
正确的做法之一是使用ObjectMapper的readTree方法:
public static <T> EntityWrapper<T> getEntityWrapper(String jsonString, Class<T> prototype) {
ObjectMapper objectMapper = new ObjectMapper();
EntityWrapper<T> wrapper = new EntityWrapper<T>();
try {
JsonNode root = objectMapper.readTree(jsonString);
Iterator<Entry<String, JsonNode>> elements = root.fields();
while (elements.hasNext()) {
Entry<String, JsonNode> node = elements.next();
String key = node.getKey();
T element = objectMapper.readValue(node.getValue().toString(), prototype);
wrapper.addEntry(key, element);
}
return wrapper;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
简单解释一下上述代码:
使用root.field()方法能够得到返回的JSON中的所有key-value对。
然后循环提取某个键值对的key和value,对于value我们可以直接使用之前的策略进行反序列化,因为这部分的结构也是固定的。
忽略不需要的字段
有时候,返回的JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有在实体类中找到。解决办法很简单,在声明ObjectMapper之后,加上上述代码:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//让Json可以缩进,可读性更好,一般用在测试和开发阶段。
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
//让map的key按自然顺序排列
mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
//日期输出格式
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
mapper.setDateFormat(outputFormat);
转自:http://blog.csdn.net/dm_vincent/article/details/46764399
http://jackyrong.iteye.com/blog/2005323
分享到:
相关推荐
总结,Java中的JSON序列化与反序列化是数据交互的重要环节,Jackson和Gson是两个常用的库,它们提供了丰富的功能和良好的API设计,使得处理JSON数据变得简单高效。通过理解和掌握这些知识,开发者可以更好地在Java...
在Spring Boot应用中,ObjectMapper是Jackson库的核心组件,它被广泛用于处理JSON数据,包括序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象)。这个强大的工具使得在Spring Boot工程...
为了使Spring Boot能够使用Fastjson进行序列化和反序列化,我们需要创建一个自定义的`FastJsonRedisSerializer`类。这个类实现了`RedisSerializer`接口,包含两个方法:`serialize`用于将Java对象转换为字节数组,`...
Spring Boot提供了对JSON的强大支持,比如使用`@RequestBody`和`@ResponseBody`注解自动处理JSON序列化和反序列化: ```java @PostMapping("/save") public ResponseEntity save(@RequestBody YourJavaClass ...
Jackson是Java中最流行的JSON处理库之一,它提供了丰富的API用于JSON的序列化(对象转JSON)和反序列化(JSON转对象)。主要包含三个核心模块:jackson-core、jackson-databind和jackson-annotations。 三、使用...
本教程将深入探讨Java中处理JSON数据的方法,包括解析JSON字符串、创建JSON对象、遍历JSON结构以及序列化和反序列化。 一、JSON简介 JSON是一种易于阅读和编写的数据格式,同时被大多数编程语言支持。它基于...
继续上面的Person类例子,如果有一个JSON字符串,你可以这样反序列化: ```java String jsonPerson = "{\"name\":\"John\", \"age\":30}"; Gson gson = new Gson(); Person person = gson.fromJson(jsonPerson,...
5. **序列化与反序列化**: 序列化是将Java对象转换为JSON字符串的过程,反序列化则相反。例如,在Jackson中,可以使用`ObjectMapper`进行这两个操作: ```java ObjectMapper mapper = new ObjectMapper(); String...
在Spring或Spring Boot中,可以通过配置`ObjectMapper`来自定义JSON序列化和反序列化的规则,例如日期格式、忽略空值等。此外,还可以通过添加`@JsonIgnore`、`@JsonInclude(JsonInclude.Include.NON_NULL)`等注解...
此外,还需要掌握如何使用Java处理JSON,例如使用Gson的`Gson.toJson()`方法将Java对象转换为JSON,或使用Jackson的`ObjectMapper`类进行序列化和反序列化。 为了有效地使用这个压缩包,你应该解压并查看其中的文件...
它的使用简单,只需简单的注解即可实现复杂的序列化和反序列化。 3. org.json:这是一个轻量级的库,适用于简单的JSON操作,提供了`JSONObject`和`JSONArray`类,便于处理JSON数据。 三、Jackson使用示例 ```java ...
同时,对于JSON中的特殊类型,如日期,我们需要自定义序列化和反序列化的策略。 此外,Echarts是一个基于JavaScript的图表库,它使用JSON数据格式来生成各种图表。在Java后端,我们可以通过上述方式将处理后的数据...
- 反序列化:将JSON字符串转换为Java对象,使用`ObjectMapper`的`readValue()`方法。 4. 添加jar包到项目: 如果你需要使用Jackson库,你需要将对应的jar包添加到你的项目中。现代的Java开发通常使用Maven或...
1. **反序列化**:使用`ObjectMapper().readValue(jsonString, YourClass.class)`将JSON字符串转换为Java对象。 2. **序列化**:通过`ObjectMapper().writeValueAsString(yourObject)`将Java对象转换为JSON字符串。 ...
它提供了高效且功能丰富的工具,使得在Java应用程序中进行JSON序列化和反序列化变得简单易行。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁、易于人阅读和编写,同时也易于机器解析和...
3. 序列化:使用`ObjectMapper`将Java对象转换为JSON字符串。 4. 反序列化:将接收到的JSON字符串转换回Java对象。 例如,如果你有一个名为`Person`的Java类,你可以这样做: ```java import ...
7. **JSON的序列化与反序列化** - 序列化是将Java对象转换为JSON字符串的过程,反序列化则是相反的过程。 - 这些库通常支持自定义序列化规则,例如忽略某些字段、处理日期格式等。 8. **使用jar包** - 将这些jar...
`jackson-core`提供了基本的JSON流处理API,`jackson-databind`则提供了将Java对象映射到JSON和反向映射的功能,而`jackson-annotations`包含了一些常用的注解,用于自定义序列化和反序列化过程。 Gson是Google提供...
在Java中,处理JSON通常需要依赖特定的库,这些库封装了JSON的解析、序列化和反序列化功能。以下是一些常见的Java JSON处理库及其使用方法: 1. **Jackson** Jackson是Java中最常用的JSON库之一,由 FasterXML ...
Jackson的`writeValueAsString()`方法用于将对象转换为JSON字符串,而`readValue()`则用于从JSON字符串反序列化回Java对象。 Fastjson是阿里巴巴提供的一个高性能的JSON库,它的使用也非常简单: ```java import ...