【问题标题】:Jackson - Map JSON string field to class/pojo that has only one field (a string)Jackson - 将 JSON 字符串字段映射到只有一个字段(字符串)的类/pojo
【发布时间】:2013-04-17 13:37:17
【问题描述】:

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

这可能使用注释或其他东西吗?还是我要为每个这样的实例编写一个自定义反序列化器?

我尝试做一些研究,发现了一些关于值实例化器或使用构造函数的信息,但是使用构造函数不是像反 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,但仍然遇到与我在下面遇到的相同的错误)。

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

谢谢。

【问题讨论】:

  • 您能发布您的 RESTful 请求的代码吗?
  • 误解了你的问题。已经更正了答案并且它有效。

标签: java json jackson


【解决方案1】:

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

【讨论】:

  • 我将@JsonProperty 放在用户名字段上方,我仍然收到此错误,“无法从字符串值实例化类型[简单类型,用户]的值;没有单字符串构造函数/工厂方法"
  • 虽然这可行,但这并不是我想要的。我发现通过放入一个构造函数(它不是空的)我能够得到与这个相同的效果。然而,我的最终目标是无需创建构造函数或 Json 创建方法(这基本上是在做构造函数无论如何都会做的事情)来做到这一点。我会给你一个赞成票,如果没有其他人能提出更好的解决方案,我会给你答案,因为你的解决方案确实有效,但不是可取的。
【解决方案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());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多