当前位置: 首页 > 知识库问答 >
问题:

通用域名格式。fasterxml。杰克逊。数据绑定。exc.UnrecognizedPropertyException:无法识别的字段“Symbol”[重复]

燕禄
2023-03-14

我尝试使用一些类似于以下内容的JSON(来自AlphaVantage):

{
    "Symbol": "IBM",
    "AssetType": "Common Stock",
    "Name": "International Business Machines Corporation",
... more properties
}

并使用Jackson解析它(

  ObjectMapper objectMapper = new ObjectMapper();
  String json = response.body().string();
  Stock stock = objectMapper.readValue(json, Stock.class);
  stock.save();

我的股票类如下所示:

@Entity
@Table(name = "stock")
public class Stock extends Model {

@Id
private Long id;
private String Symbol;
private String AssetType;
private String Name;
... other properties

public Long getId() {
    return this.id;
}

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

public String getSymbol() {
    return this.Symbol;
}
public void setSymbol(String Symbol) {
    this.Symbol = Symbol;
}

... other setters/getters

}

相反,我得到了以下错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Symbol" (class com.myprojectname.Stock), not marked as ignorable (60 known properties: "ebitda", "sharesOutstanding", "bookValue", ....more fields

为什么Jackson在连接到我的股票类时遇到问题?如何将JSON中的符号连接到Stock类中的符号?

编辑:如果我将符号更改为小写,我会收到相同的错误消息:

@Entity
@Table(name = "stock")
public class Stock extends Model {

@Id
private Long id;
private String symbol;

public String getSymbol() {
    return this.symbol;
 }
public void setSymbol(String symbol) {
    this.symbol = symbol;
 }
}

共有2个答案

顾乐池
2023-03-14

您还可以将ObjectMapper配置为仅检查字段并忽略getter:

JsonMapper mapper = JsonMapper.builder()
        .visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
        .visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
        .build();
  • 如何指定jackson只使用字段-最好是全局的
咸琪
2023-03-14

将属性的名称从Symbol更改为符号不会有帮助,因为我们在json文件中仍然有Symbol

您可以尝试使用示例中的@JsonProperty注释。对于“Symbol”json字段,它可以如下所示:

//...
    private String Symbol;

    @JsonProperty("Symbol")
    public String getSymbol() {
        return this.Symbol;
    }

    @JsonProperty("Symbol")
    public void setSymbol(String symbol) {
        this.Symbol = symbol;
    }
// ...

这种方法也适用于与json对应的大小写字母不同的其他字段。

编辑:就像我上面评论中链接的问题的答案一样——转述一下:

由于setter方法名为setSymbol()Jackson假定变量名为symbol,因为Java命名约定(变量应以小写字母开头)。

编辑(2):其他选项将利用对象映射器配置。因此,您可以使用此处的方法,而不是注释方法,并使映射器不区分大小写:

objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

我发现其他有用的属性是:

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

在上面链接的Baeldung的文章中描述

 类似资料: