【问题标题】:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Symbol" [duplicate]com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“符号”[重复]
【发布时间】:2021-02-11 03:09:53
【问题描述】:

我正在尝试获取一些看起来像这样的 JSON(来自 AlphaVantage):

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

并使用 Jackson (& Ebeans) 解析它:

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

我的 Stock 类如下所示:

@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 在连接到我的 Stock 课程时遇到问题?如何将 JSON 中的 Symbol 连接到 Stock 类中的 Symbol?

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

@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;
 }
}

【问题讨论】:

  • 这能回答你的问题吗? Jackson JSON field mapping capitalization?
  • 这绝对让我走上了正确的道路,但是当我在 Stock 类变量中将 Symbol 更改为 symbol 时,我仍然得到:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "符号”

标签: java json jackson ebean


【解决方案1】:

将属性名称从 Symbol 更改为 symbol 将无济于事,因为我们在 json 文件中仍然有 "Symbol"。

你可以尝试使用@JsonProperty注解like in the example。对于"Symbol" json 字段,它可能如下所示:

//...
    private String Symbol;

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

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

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

编辑:就像我上面评论中链接的问题中的the answer 一样 - 解释它:

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

edit(2):其他选项将利用 the object mapper configuration。因此,您可以使用here 中的方法代替注释方法,并使映射器不区分大小写:

objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

我觉得有用的其他属性是:

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

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

【讨论】:

    【解决方案2】:

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

    JsonMapper mapper = JsonMapper.builder()
            .visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
            .visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
            .build();
    

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 2016-04-13
      • 2016-01-26
      • 2016-10-09
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多