`

使用ObjectMapper对含有任意key的JSON进行反序列化

    博客分类:
  • JSON
 
阅读更多
使用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序列化与反序列化

    总结,Java中的JSON序列化与反序列化是数据交互的重要环节,Jackson和Gson是两个常用的库,它们提供了丰富的功能和良好的API设计,使得处理JSON数据变得简单高效。通过理解和掌握这些知识,开发者可以更好地在Java...

    springboot工程中使用ObjectMapper解析JSON字符串

    在Spring Boot应用中,ObjectMapper是Jackson库的核心组件,它被广泛用于处理JSON数据,包括序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象)。这个强大的工具使得在Spring Boot工程...

    SpringBoot Redis配置Fastjson进行序列化和反序列化实现

    为了使Spring Boot能够使用Fastjson进行序列化和反序列化,我们需要创建一个自定义的`FastJsonRedisSerializer`类。这个类实现了`RedisSerializer`接口,包含两个方法:`serialize`用于将Java对象转换为字节数组,`...

    Java中使用Json

    Spring Boot提供了对JSON的强大支持,比如使用`@RequestBody`和`@ResponseBody`注解自动处理JSON序列化和反序列化: ```java @PostMapping("/save") public ResponseEntity save(@RequestBody YourJavaClass ...

    java中json的封装和解析

    Jackson是Java中最流行的JSON处理库之一,它提供了丰富的API用于JSON的序列化(对象转JSON)和反序列化(JSON转对象)。主要包含三个核心模块:jackson-core、jackson-databind和jackson-annotations。 三、使用...

    java处理JSON数据

    本教程将深入探讨Java中处理JSON数据的方法,包括解析JSON字符串、创建JSON对象、遍历JSON结构以及序列化和反序列化。 一、JSON简介 JSON是一种易于阅读和编写的数据格式,同时被大多数编程语言支持。它基于...

    JSON使用例子

    继续上面的Person类例子,如果有一个JSON字符串,你可以这样反序列化: ```java String jsonPerson = "{\"name\":\"John\", \"age\":30}"; Gson gson = new Gson(); Person person = gson.fromJson(jsonPerson,...

    JSON的依赖包啊

    5. **序列化与反序列化**: 序列化是将Java对象转换为JSON字符串的过程,反序列化则相反。例如,在Jackson中,可以使用`ObjectMapper`进行这两个操作: ```java ObjectMapper mapper = new ObjectMapper(); String...

    转json要用的包

    在Spring或Spring Boot中,可以通过配置`ObjectMapper`来自定义JSON序列化和反序列化的规则,例如日期格式、忽略空值等。此外,还可以通过添加`@JsonIgnore`、`@JsonInclude(JsonInclude.Include.NON_NULL)`等注解...

    json.zip_JSON

    此外,还需要掌握如何使用Java处理JSON,例如使用Gson的`Gson.toJson()`方法将Java对象转换为JSON,或使用Jackson的`ObjectMapper`类进行序列化和反序列化。 为了有效地使用这个压缩包,你应该解压并查看其中的文件...

    java json文档和示例

    它的使用简单,只需简单的注解即可实现复杂的序列化和反序列化。 3. org.json:这是一个轻量级的库,适用于简单的JSON操作,提供了`JSONObject`和`JSONArray`类,便于处理JSON数据。 三、Jackson使用示例 ```java ...

    Json与java对象之间相互转换源码

    同时,对于JSON中的特殊类型,如日期,我们需要自定义序列化和反序列化的策略。 此外,Echarts是一个基于JavaScript的图表库,它使用JSON数据格式来生成各种图表。在Java后端,我们可以通过上述方式将处理后的数据...

    Json数据转换需要的jar包

    - 反序列化:将JSON字符串转换为Java对象,使用`ObjectMapper`的`readValue()`方法。 4. 添加jar包到项目: 如果你需要使用Jackson库,你需要将对应的jar包添加到你的项目中。现代的Java开发通常使用Maven或...

    Android(全JSON解析含第三方jar包)

    1. **反序列化**:使用`ObjectMapper().readValue(jsonString, YourClass.class)`将JSON字符串转换为Java对象。 2. **序列化**:通过`ObjectMapper().writeValueAsString(yourObject)`将Java对象转换为JSON字符串。 ...

    jackson的jar包,用于转换map与list到json

    它提供了高效且功能丰富的工具,使得在Java应用程序中进行JSON序列化和反序列化变得简单易行。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁、易于人阅读和编写,同时也易于机器解析和...

    JSON很好的JAR包

    3. 序列化:使用`ObjectMapper`将Java对象转换为JSON字符串。 4. 反序列化:将接收到的JSON字符串转换回Java对象。 例如,如果你有一个名为`Person`的Java类,你可以这样做: ```java import ...

    json相关的6个jar包

    7. **JSON的序列化与反序列化** - 序列化是将Java对象转换为JSON字符串的过程,反序列化则是相反的过程。 - 这些库通常支持自定义序列化规则,例如忽略某些字段、处理日期格式等。 8. **使用jar包** - 将这些jar...

    json必须的jar文件,用json传输的来看看

    `jackson-core`提供了基本的JSON流处理API,`jackson-databind`则提供了将Java对象映射到JSON和反向映射的功能,而`jackson-annotations`包含了一些常用的注解,用于自定义序列化和反序列化过程。 Gson是Google提供...

    Json转对象忽略大小写

    然而,有时我们可能遇到JSON字符串的键首字母大写的情况,这与Java中的驼峰命名规则不一致,导致反序列化时出现匹配问题。标题“Json转对象忽略大小写”所涉及的知识点主要是如何在Java中处理这种情况,让JSON解析器...

    java使用json的jar包集合

    在Java中,处理JSON通常需要依赖特定的库,这些库封装了JSON的解析、序列化和反序列化功能。以下是一些常见的Java JSON处理库及其使用方法: 1. **Jackson** Jackson是Java中最常用的JSON库之一,由 FasterXML ...

Global site tag (gtag.js) - Google Analytics