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

Jackson-将JSON字符串字段映射到只有一个字段(字符串)的类/pojo

聂建茗
2023-03-14

我正在编写一个JSON接口/库,用于Bugzilla的webservice。

这可以使用注释或其他内容吗?还是要为每个这样的实例编写一个自定义反序列化程序?

我试着做了一些研究,发现了一些关于值实例化器或使用构造函数的信息,但使用构造函数不是反bean吗?我发现新特性的文档很少或难以理解。

示例

public class Bug{
  // Bug info, strings, ints, yadda yadda.
 private User creator;   // creator of the bug, json is like   {"creator":"blahblah@email.com"}
}

public class User{
 private String username;
}
//insert setter/getter.

我对一个字段使用pojo的原因是,这个用户类是由另一个具有更多字段的用户类扩展的。虽然我可以实现一个构造函数来达到这个效果,但这样做意味着我必须为所有其他子类实现相同的构造函数。我觉得有类似于@JsonValue的东西,但是对于设置(我在我的setter上尝试了JsonCreator,但仍然得到了与下面相同的错误)。

"无法从String值实例化类型[简单类型,类User]的值;没有单字符串构造函数/工厂方法"

谢谢。

共有2个答案

施琦
2023-03-14

您不需要使用@JsonCreator或@JsonValue或construtor,Jackson将使用javabean方法来处理OTTB:请尝试以下方法:

public class User{
    private String username;

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public static void main(String[] args) throws Exception {
        User u = new User();
        u.setUsername("name");

        ObjectMapper m = new ObjectMapper();
        String userString = m.writeValueAsString(u);
        System.out.println(userString);
        User u1 = m.readValue(userString, User.class);
        System.out.println(u1.getUsername());
    }
}
司马越
2023-03-14

使用@JsonCreator进行反序列化,使用@JsonValue进行序列化。已经测试了代码。请确保getJsonString()是公共方法。

例如:

public class User{
    private String username;

    @JsonValue
    public String getJsonString() {
         return username;
    }

    @JsonCreator
    private static User parseJson(String jsonStr) {
        User u = new User();
        u.username = jsonStr;
        return u;
    }

    public static void main(String[] args) {
        User u = new User();
        u.userName = "Niraj";

        ObjectMapper m = new ObjectMapper();
        String jsonString = m.writeValueAsString(u);
        User u1 = m.readValue(jsonString, User.class);
    }
}
 类似资料:
  • 我有以下JSON字符串: 我只想要和。我试过这样的方法: 但我得到了以下错误: 我只使用过几次JSON。有人能帮我吗? 对我来说最好的例子是这样的,我在另一个例子中做过: 可能吗? 现在我已经做到了: 我试着这样做: 然后: 但现在当我做一个Prtinout时,我会得到和以前一样的错误:

  • 问题内容: 我有一个JSON响应,我需要将对应的JSON字符串映射到特定的Response类,是否有任何工具或框架可以做到这一点。 响应类为: Json响应字符串为{“ 0”:{“ 0”:“ Rockey”,“ 1”:“ John”}} 我将Apache CXF Framework与Jettison一起使用,因为JSON Provider还使用JAXB将数据连接到低带宽客户端。 请注意,我要将数字

  • 我有一个非常复杂的对象。 我的目标是将问题答案集映射展平,以便将值中的所有列表合并为一个 我没有试图找出如何在Dozer中将所有这些列表合并到一个列表中,我甚至不确定它是否能够做到,而是编写了一个自定义setter。 我假设这意味着Dozer只需读取第一个对象的调查并将其放入makeFlatSurvey,但它读取调查对象上的questionAnswerGroup字段,然后遍历QuestionAns

  • 我有课 其中field 如果使用ObjectMapper反序列化此对象 结果是这样的: 添加了转义(\),并且json字段有引号(")。如何正确摆脱这一点并制作单个JSON?像这样:

  • 这个问题不难,我已经用自己的方法解决了,但我想听听你的意见,也许有什么方法可以让这成为一个改进的选择?Java 8-11。