当前位置: 首页 > 知识库问答 >
问题:

如何反序列化测试列表与 jackson / junit4 / spring-boot

卜泓
2023-03-14

我有两个问题合二为一:

首先,我正在尝试使用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()))
}
[
  {
    "color": "white",
    "jobs": {
        "name": "default",
        "time": 40
    },
    "number": 4
  }
]

错误:

java.lang.ClassCastException: class com.fasterxml.jackson.databind.node.ArrayNode 不能 cast to class com.fasterxml.jackson.databind.node.ObjectNode (com.fasterxml.jackson.databind.node.ArrayNode 和 com.fasterxml.jackson.databind.node.ObjectNode 位于 loader 'app' 的未命名模块中)

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;
}

我是在杰克逊的nooby,因此,所有的建议都是受欢迎的,谢谢!!

共有1个答案

郤瀚
2023-03-14

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

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

只需向< code>content方法< code >提供< code>contentToSave。内容(contentToSave)。

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

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

objectMapper.convert(jsonData, new TypeReference<List<ObjectClass>>() {});
 类似资料:
  • 我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。 我的对象看起来像这样。 我希望有一种方法可以将其映射到json,看起来像: 我们希望能够做到这一点,以便我们可以将属性添加到列表中。

  • 我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。

  • 我想为我们的REST API实现一个自定义的反序列化器,它不仅被Java应用程序使用。因此,我不想让Jackson将类型信息放入序列化的JSON中。 我目前正在努力反序列化<code>CollectionExpand</code>,因为它包含特定<code>ResourceModel</code>的<code>数据</code>列表。 < code>ResourceModel是一个接口,每个< c

  • 我有以下控制器: 使用以下请求对象: 当帖子通过并查看我得到的对象时,有效负载列表中有LinkedHashMap对象,而不是我的DTO类型的对象。 如何让Spring jackson将JSON转换为我的DTO对象。请记住,我计划对其他对象列表重用包装器响应DTO,这就是我使用通用列表(List)的原因。 这是我正在尝试的JSON。

  • 我尝试调用一个url谁接受列表。 发送的数据为 “{”时间戳“:1445958336633,”状态“:400,”错误“:”错误请求“,”异常“:”org.springframework.http.converter.httpmessagenotreadableException“,”消息“:”无法读取文档:无法反序列化START_OBJECT令牌之外的java.util.arraylist实例\n

  • 我试图通过Kotlin使用Jackson对lastfm api提供的xml进行反序列化。我用JAXB在Java中实现了这一点,我正在尝试移植它。除以下示例中的“未包装列表”字段外,所有功能都正常工作。我知道Track数据类正在工作,因为如果我使用而不是