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

时间:2013-04-17 13:37:18

标签: java json jackson

我正在编写一个JSON接口/库来与Bugzilla的web服务一起使用。

这是否可以使用注释或其他东西?或者我是否为这样的每个实例编写自定义反序列化器?

我尝试过做一些研究,发现一些有关Value Instantiator或使用构造函数的信息,但是不使用构造函数反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.

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

使用@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);
    }
}

答案 1 :(得分:2)

你不需要使用@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());
    }
}