JSON.decodeValue解码异常

时间:2015-12-23 22:20:15

标签: java json

我想让这个java代码工作:

RequestManager rm = Json.decodeValue(request.getBodyAsString(), RequestManager.class);

但我有这个错误:

io.vertx.core.json.DecodeException: Failed to decode:No suitable constructor found for type [simple type, class RequestManager]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?) at [Source: {"messageId":"fsdfsdf"}; line: 1, column: 2]

这是我班级的代码:

public class RequestManager {
    private String messageId;
    private String messageContent;

    public RequestManager(String messageId, String messageContent) {
        this.messageId = messageId;
        this.messageContent = messageContent;
    }

    public String getMessageId() {
        return messageId;
    }

    public String getMessageContent() {
        return messageContent;
    }
}

我真的不知道它为什么不起作用,关于它的问题很少,但它们无关紧要。

有人可以帮忙吗?

编辑 -

我知道有这样的RequestManager类:

public class RequestManager {
    private String messageId;
    private String messageContent;

    public RequestManager(String messageId, String messageContent) {
        this.messageId = messageId;
        this.messageContent = messageContent + "check";
    }

    public RequestManager() {

    }

    public String getMessageId() {
        return messageId;
    }

    public String getMessageContent() {
        return messageContent;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    public void setMessageContent(String messageContent) {
        this.messageContent = messageContent;
    }
}

但是当我尝试打印使用RequestManager创建的JSON.decodeValue对象的字段时,它会返回null。我已经在过去做过那个并且有同样的错误。我认为这是因为使用了空构造函数。 我还是不太懂......

编辑 - 2

我试图再次改变我的课程,这里是:

@JsonIgnoreProperties(ignoreUnknown=true)
public class RequestManager {
    @JsonProperty("messageId") private String messageId;
    @JsonProperty("messageContent") private String messageContent;

    @JsonCreator
    public RequestManager(@JsonProperty("messageId") String messageId, @JsonProperty("messageContent") String messageContent) {
        this.messageId = messageId;
        this.messageContent = messageContent;
        System.out.println("This constructor is used.");
    }

    public RequestManager() {

    }

    public String getMessageId() {
        return messageId;
    }

    public String getMessageContent() {
        return messageContent;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    public void setMessageContent(String messageContent) {
        this.messageContent = messageContent;
    }
}

这是我的主要内容:    final RequestManager rm = Json.decodeValue("{\"messageId\":\"themessage\"}", RequestManager.class); System.out.println(rm.getMessageContent());

"{\"messageId\":\"themessage\"}" = JSON格式,我很确定,因为如果不是,则decodeValue会返回一个Decode Exception。

现在打印时,该字段为“nullcheck”。所以这意味着构造函数使用得很好,但字段为空。我在哪里做错了?

2 个答案:

答案 0 :(得分:0)

这是因为你有自己的构造函数,而JSON不知道应该将哪些值传递给它。

他们的GitHub页面上有文档,说明如何设置一个您希望以JSON形式提供给您并转换为Java的数据对象。

https://github.com/vert-x3/vertx-codegen#data-objects

根据您链接到http://vertx.io/blog/some-rest-with-vert-x/的示例,请注意他们如何显式提供不带参数的构造函数,以及公共setter方法

Whisky()
setName(String name)
setOrigin(String origin)

另一种方法是提供注释:https://github.com/FasterXML/jackson-annotations。您可以根据需要使用注释或使用 bean 类(getter和setter)来选择如何操作。注释的优势在于您可以说“转换为JSON时忽略此值”等等。您可以更明确地使用注释。 我建议选择一个并坚持下去。随着项目的增长,一致性变得非常重要。

答案 1 :(得分:0)

您可以尝试使用空构造函数。