我正在编写一个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]类型的值;没有单字符串构造函数/工厂方法”
感谢。
答案 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());
}
}