使用Jersey和Jackson进行Map的序列化和反序列化

uk

我有一个Pojo对象,该对象由Jersey使用jackson序列化:

public class BookOfFriendsAnswer {
private Map<String, List<BookSummary>> books;

public BookOfFriendsAnswer() {

}

public BookOfFriendsAnswer(Map<String, List<BookSummary>> books) {
    this.books = books;
}

public Map<String, List<BookSummary>> getBooks() {
    return books;
}

public void setBooks(Map<String, List<BookSummary>> books) {
    this.books = books;
}
}

序列化产生一个像这样的JSon:

{
  "books": {
    "entry": [
      {
        "key": "54567bbce4b0e0ef9379993e",
        "value": "BookSummary{id='54567bbde4b0e0ef9379993f', title='title 1', authors=[Steve,James] } BookSummary{id='54567bd9e4b0e0ef93799940', title='Title 2', authors=[Simon, Austin]}"
      }
    ]
  }
}

但是,当我尝试反序列化来自客户端的消息时,如下所示:

mapper.readValue(json, clazz)

我收到以下错误:

无法识别的字段“键”(类com.example.server.api.BookSummary),未标记为可忽略

我不知道问题是来自服务器生成的JSOn还是客户端的反序列化。

您知道问题出在哪里以及如何解决吗?

非常感谢

保罗·萨姆索塔

因此,经过以下测试:

  • Jersey 1.18.1(jersey-json-1.18.1用于JSON支持)
  • Jersey 2.13(带有jersey-media-json-jackson-2.13JSON支持)
  • Jersey 2.13(带有jersey-media-moxy-2.13JSON支持)

最后一个测试(jersey-media-moxy-2.13)是唯一产生此精确输出的测试

{
  "books": {
    "entry": [
      {
        "key": "54567bbce4b0e0ef9379993e",
        "value": "BookSummary{id='54567bbde4b0e0ef9379993f', title='title 1', authors=[Steve,James] } BookSummary{id='54567bd9e4b0e0ef93799940', title='Title 2', authors=[Simon, Austin]}"
      }
    ]
  }
}

话虽如此,我将假设您使用的是Jersey 2.x版本。我不确定MOXy中是否有任何配置可以更好地支持此用例,但是为了使事情变得简单,只需添加以下依赖项,并摆脱MOXy

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey-version}</version>
</dependency>

这样,您将获得正确的JSON输出

{ //  BookOfFriendsAnswer object
    "books": {  // Map<String, List<BookSummary>> books
        "randomKey": [  // String (key) , List<BookSummary> (value)
            {  // BookSummary object
                "id": "54567bbde4b0e0ef9379993f",
                "title": "Title 1",
                "authors": ["Steve", "James"]
            }
        ]
    }
}

简单测试

资源方法

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getResponse() {
    BookOfFriendsAnswer books = new BookOfFriendsAnswer();
    String id = "randomKey";  <===== Not sure if you want the key to be 
                                     the BookSummary id
    BookSummary summary = new BookSummary();
    summary.setId(id);
    summary.setTitle("Title 1");
    summary.getAuthors().add("Steve");
    summary.getAuthors().add("James");
    List<BookSummary> summaries = new ArrayList<>();
    summaries.add(summary);
    books.getBooks().put("randomKey", summaries);
    return Response.ok(books).build();
}

使用ObjectMapper测试

@Test
public void testGetIt() throws Exception {
    String responseMsg = target.path("book").request().get(String.class);
    ObjectMapper mapper = new ObjectMapper();
    BookOfFriendsAnswer books = mapper.readValue(
            responseMsg, BookOfFriendsAnswer.class);
    System.out.println(books);
}

不使用ObjectMapper进行测试-使用自动配置的Jackson提供程序

@Test
public void testGetIt() throws Exception {
    BookOfFriendsAnswer responseMsg
            = target.path("book").request().get(BookOfFriendsAnswer.class);
    System.out.println(responseMsg);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章