【问题标题】:How to deserialize a test a List<Oject> with jackson / junit4 / spring-boot如何使用 jackson / junit4 / spring-boot 反序列化测试 List<Object>
【发布时间】:2023-04-02 07:50:01
【问题描述】:

我有两个问题:

首先,我正在尝试使用 Junit4 测试申请后,我有这样的事情:

  @Test
public void postTest()
{
  final String contentToSave = new String(Files.readAllBytes(Paths.get("src/test/resources/savePost.json")));

  final ObjectNode jsonContentToSave = (ObjectNode) objectMapper.readTree(contentToSave);

  mockMvc.perform(post(apiContext
      + "/url/default/").session(httpSession).contentType(MediaType.APPLICATION_JSON_VALUE)
                                                        .content(jsonContentToSave.toString()))
}

此代码在其他请愿书中对我有用,如果我使用这种类型的 JSON,则会抛出异常

[
  {
    "color": "white",
    "jobs": {
        "name": "default",
        "time": 40
    },
    "number": 4
  }
]

错误:

java.lang.ClassCastException:com.fasterxml.jackson.databind.node.ArrayNode 类无法转换为 com.fasterxml.jackson.databind.node.ObjectNode 类(com.fasterxml.jackson.databind.node.ArrayNode 和com.fasterxml.jackson.databind.node.ObjectNode 位于加载程序“app”的未命名模块中)

我对 Jackson 的另一个问题是反序列化这个 json,我尝试了类似的方法,但根本找不到:

public static List<ObjectClass> jsonToObject(final JsonNode jsonData){
  ObjectMapper objectMapper = new ObjectMapper();
   List<ObjectClass> myObjects = null;
  try{
    myObjects = objectMapper.readValue(jsonData.textValue(),
                                     new TypeReference<List<ObjectClass>>() {
                                     });
  }
  catch (IOException e)
  {
    // TODO Auto-generated catch block
  e.printStackTrace();
 }
return myObjects;
}

我是杰克逊的菜鸟,因此,欢迎所有建议,谢谢!!

【问题讨论】:

  • 嗨,我今天没有太多时间解释它,但我已经创建了一个示例来解决你的问题,你可以在这里找到它github.com/marcosbarbero/…
  • 嗨@MarcosBarbero,我阅读了您的代码,对此有一些疑问。如果我需要获取一个 List 会发生什么,只需将 (@RequestBody Person person) 更改为 (@RequestBody List person) 就足够了?并感谢您回答我!
  • 很遗憾,我接下来的几天都不在电脑前,您只需将 RequestBody 更改为期望人员列表并在执行您的请求时发送一​​个数组

标签: java spring-boot junit jackson


【解决方案1】:

您可以通过删除第二行来简化postTest 测试方法:

final ObjectNode jsonContentToSave = (ObjectNode) objectMapper.readTree(contentToSave);

只需将contentToSave 提供给content 方法:.content(contentToSave)

但是,如果您真的想这样做,只需将 ObjectNode 替换为 ArrayNodeArrayNode 将在顶级元素是 JSON Array 时使用,例如[1,2,3]ArrayNodeObjectNode 都扩展了 JsonNode,您可以安全地使用它。

jsonToObject 方法接受JsonNode,您不需要将其序列化为String 并反序列化回另一种类型。你可以使用convert方法:

objectMapper.convert(jsonData, new TypeReference<List<ObjectClass>>() {});

【讨论】:

  • 嗨,这个实现给我抛出了以下错误:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Can not construct instance of gcs.fds.api.history.ActionInfo: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?) at [Source: N/A; line: -1, column: -1] (through reference chain: java.util.ArrayList[0])你知道吗?
  • @Laa-Laa,它看起来像 ActionInfo 类,其构造函数与您要反序列化的 JSON Object 不匹配。看起来这是一个新问题和新问题 - 如果它有帮助,您可以接受此答案并创建包含所有详细信息的新问题:ActionInfo class 和 JSON 您要反序列化的有效负载。
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 2018-01-24
相关资源
最近更新 更多