1

我正在编写一个 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,但仍然遇到与我在下面遇到的相同的错误)。

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

谢谢。

4

2 回答 2

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);
    }
}
于 2013-04-17T13:45:37.587 回答
2

您不需要使用 @JsonCreator 或 @JsonValue 或构造函数,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());
    }
}
于 2013-04-18T22:08:24.270 回答