gpt4 book ai didi

java - Jackson - 由于构造函数导致的 JsonMappingException

转载 作者:IT老高 更新时间:2023-10-28 12:51:46 27 4
gpt4 key购买 nike

尝试反序列化 JSON 时遇到以下异常

No suitable constructor found for type [simple type, class MyObj$obj$Card]: can not instantiate from JSON object (need to add/enable type information?) at [Source: java.io.StringReader@4344ee21; line: 1, column: 201] (through reference chain: MyObj["obj"]->Obj["cards"])

JSON 是

{
"obj":{
"api":"OK",
"cache":false,
"cards":[
{
"id":1232995897,
"items":[
{
"id":"vmdSJLpnY",
"cat":50,
"rating":0.0
}
]
},
{
"id":0005897,
"items":[
{
"id":"vxdSJLpnY",
"cat":50,
"rating":0.0
}
]
}
]
}
}

Obj 类中我有以下语句

@JsonProperty("cards") private Card[] 卡片;

这会产生上述异常。将类型 Card[] 更改为 Object[] 不会产生异常,但它缺少我想要获得的正确映射。

任何线索我该如何解决它?一个片段会很棒!这个错误到底意味着什么?

更新

我已经包含了 Java 类。

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.gson.Gson;

@JsonIgnoreProperties(ignoreUnknown=true)
public final class MyObj {
@JsonIgnoreProperties(ignoreUnknown=true)
public final class Obj {
@JsonIgnoreProperties(ignoreUnknown=true)
public final class Card {
@JsonIgnoreProperties(ignoreUnknown=true)
public final class Item {
@JsonProperty("id") private String id;
@JsonProperty("cat") private String cat;
@JsonProperty("rating") private String rating;
public final String getId() { return id; }
public final String getCat() { return cat; }
public final String getRating() { return ranting; }
public final String toString() { return new Gson().toJson(this); }
}

@JsonProperty("items") private Item[] items;
public final Item[] getItems() { return items; }
public final String toString() { return new Gson().toJson(this); }
}

@JsonProperty("cards") private Card[] cards;
public Card[] getCards() { return cards; }
public final String toString() { return new Gson().toJson(this); }
}


@JsonProperty("obj") MyObj obj;
public final Card[] getCards(){ return apiServiceResultsNoLists.getCards(); }
}

最佳答案

我认为问题很可能出在 Card 对象上

  • 它可能没有默认构造函数
  • 如果它没有默认构造函数,则应使用 @JsonCreator 进行注释

编辑我有两件事:
* 你没有二传手。
*您没有可以设置您的文件的公共(public)构造函数。

如果你不给它任何(合法*)手段,反序列化器应该如何填充你的字段?

解决方案:
-> 将公共(public) setter 添加到类
-> 或创建带有 @JsonCreator 注释的参数化构造函数

*:当然,解析器可以做反射性的“修改可见性”技巧,但是拜托,这不是“它的播放方式”

EDIT2我认为这应该可行,但是我无法对其进行测试-我手头没有一个项目可以正确设置 jackson (这只是其中的一部分,但我认为很容易解释我想要的显示。)注意,我将数组更改为列表:

    @JsonIgnoreProperties(ignoreUnknown=true)     
public final class Card {
@JsonIgnoreProperties(ignoreUnknown=true)

public final class Item {
@JsonProperty("id") private String id;
@JsonProperty("cat") private String cat;
@JsonProperty("rating") private String rating;

@JsonCreator
public Item(@JsonProperty("id") String id, @JsonProperty("cat") String cat, @JsonProperty("rating") String rating) {
this.id = id;
this.cat = cat;
this.rating = rating;
}


public final String getId() { return id; }
public final String getCat() { return cat; }
public final String getRating() { return ranting; }
public final String toString() { return new Gson().toJson(this); }
}
@JsonProperty("items") private List<Item> items;

@JsonCreator
public Card(@JsonProperty("items") List<Item> items) {
this.items = items;
}

public final List<Item> getItems() { return items; }

public final String toString() { return new Gson().toJson(this); }
}

关于java - Jackson - 由于构造函数导致的 JsonMappingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12835911/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com