【问题标题】:JSON de-serialization using jackson使用杰克逊的 JSON 反序列化
【发布时间】:2017-12-12 15:53:18
【问题描述】:

我有一个 JSON 想要反序列化为 java 对象。我尝试过但没有成功。如果有人帮助它,真的很感激。我遇到了错误。

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
// Note : vairable 'body' is the JSON string which I've shared below.
RpcResponse rs = mapper.readValue(body, RpcResponse.class);

线程“main”中的异常 com.fasterxml.jackson.databind.exc.MismatchedInputException:不能 从 START_ARRAY 令牌中反序列化 Result 的实例

{
"error": null,
"id": "12345",
"result": {
    "inventory": [{
        "history": [{
            "when": "2012-08-30T07:28:51Z",
            "changes": [{
                "removed": "",
                "added": "1",
                "field_name": "qty"
            },
            {
                "removed": "normal",
                "added": "major",
                "field_name": "popularity"
            }],
        "id": 474599,
        "alias": null
    }]
}

}

这里是java类

public class RpcResponse {

private String error;
private String id;
private Map<String, Result> result;

public String getError() {
    return error;
}

public void setError(String error) {
    this.error = error;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public Result getResult() {
    return result;
}

public void setResult(Result result) {
    this.result = result;
}

}

public class Result {

private Map<String, List<Inventory>> inventory;

public Map<String, List<Inventory>> getBugs() {
    return inventory;
}

public void setBugs(Map<String, List<Inventory>> inventory) {
    this.inventory = inventory;
}

}

public class Inventory {

private String id;
private String alias;
private Map<String, List<History>> history;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getAlias() {
    return alias;
}

public void setAlias(String alias) {
    this.alias = alias;
}

public Map<String, List<History>> getHistory() {
    return history;
}

public void setHistory(Map<String, List<History>> history) {
    this.history = history;
}

}

public class History {

private String who;
private String when;
private Map<String, Changes> changes;

public String getWho() {
    return who;
}
public void setWho(String who) {
    this.who = who;
}
public String getWhen() {
    return when;
}
public void setWhen(String when) {
    this.when = when;
}
public Map<String, Changes> getChanges() {
    return changes;
}
public void setChanges(Map<String, Changes> changes) {
    this.changes = changes;
}

}

【问题讨论】:

  • 你用来反序列化的代码在哪里?
  • 您应该编辑您的问题并添加该类。评论区不容易看懂
  • 您的示例代码无法编译——因此声称它引发了该异常是一个谎言。
  • @slim 很可能是复制/粘贴错误。真正的问题是没有正确的成员类型。
  • 复制/粘贴错误,如“未复制他运行的实际代码”

标签: java json json-deserialization jackson2


【解决方案1】:

在 RCP 响应中,

private Map<String, Result> result;

应该是

private Result result;

在结果中,

private Map<String, List<Inventory>> inventory;

应该是

private List<Inventory> inventory;

在库存中,

private Map<String, List<History>> history;

应该是

private List<History> history;

在历史上,Map&lt;String,Changes&gt; 应该是 Collection&lt;Changes&gt;,等等

【讨论】:

  • 您可能还需要将 getBugs 更改为 getInventory 或给杰克逊一个提示
  • 这不是问题的答案。这是他应该做的工作,让问题中的代码在声称它引发运行时异常之前进行编译。
  • getBugs 是一个错字。实际的 getter 和 setter 是正确的。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多