首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON对象-无法识别的字段,不能标记为可忽略

JSON对象-无法识别的字段,不能标记为可忽略
EN

Stack Overflow用户
提问于 2018-11-22 12:26:49
回答 4查看 25.2K关注 0票数 7

我正在尝试将下面的JSON转换成一个java对象。

代码语言:javascript
复制
{
  "Data":[
    {
      "AccountId":"2009852923",
      "Currency":"EUR",
      "Nickname":"SA 01",
      "Account":{
        "SchemeName":"BBAN",
        "Name":"SA 01",
        "Identification":"2009852923"
      },
      "Servicer":{
        "SchemeName":"BICFI",
        "Identification":"FNBSZAJJ"
      }
    },
    {
      "AccountId":"1028232942",
      "Currency":"EUR",
      "Nickname":"FNBCREDIT",
      "Account":{
        "SchemeName":"BBAN",
        "Name":"FNBCREDIT",
        "Identification":"1028232942"
      },
      "Servicer":{
        "SchemeName":"BICFI",
        "Identification":"FNBSZAJJ"
      }
    }
  ],
  "Links":{
    "self":"http://localhost:3000/api/open-banking/accounts/1009427721/transactions"
  },
  "Meta":{
    "total-pages":1
  }
}

使用以下DTO (为了简洁起见,引用的类尚未发布)。

代码语言:javascript
复制
public class TransactionDTO {
    private Data[] data;
    private Links links;
    private Meta meta;
    public Data[] getData () {  return data; }
    public void setData (Data[] data) { this.data = data; }
    public Links getLinks () { return links; }
    public void setLinks (Links links) { this.links = links; }
    public Meta getMeta () { return meta; }
    public void setMeta (Meta meta) { this.meta = meta; }
}

将DTO转换为Java对象的代码如下:

代码语言:javascript
复制
private TransactionDTO marshall(String accountTransactionsJSON) {
    ObjectMapper objectMapper = new ObjectMapper();
    TransactionDTO transactionDTO = null;
    try {
        transactionDTO = objectMapper.readValue(accountTransactionsJSON, TransactionDTO.class);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return transactionDTO;
}

我得到了一个错误:

代码语言:javascript
复制
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Data" (class xxx.dto.TransactionDTO), not marked as ignorable (3 known properties: "links", "data", "meta"])
 at [Source: java.io.StringReader@48f43b70; line: 2, column: 11] (through reference chain: xxx.dto.TransactionDTO["Data"])

我尝试了不同的方法来解决这个问题,例如:

代码语言:javascript
复制
objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

以及:

代码语言:javascript
复制
@JsonRootName(value = "data")

但我要么遇到同样的问题,要么没有问题,但TransactionDTO只包含null值。

我想问题是Data字段,但我不知道如何解决这个问题(解决方案这里也不适合我)。

问题

  1. 知道怎么解决这个问题吗?
  2. 访问器案例是否应该反映JSON中的情况?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-11-22 17:42:33

问题是您的JSON属性名称(例如"Data")与您的Java名称(例如data)不匹配。除了@psmagin的答案之外,还有两种解决方法:

  1. 保持Java代码不变。在JSON内容中,所有键(从:留下的字符串)从第一大写改为第一小写: {“数据”:[{ "accountId":"2009852923",“货币”:“EUR”,“昵称”:“SA 01",”帐户“:{ "schemeName":"BBAN","name":"SA 01",”标识“:”2009852923“} .}
  2. 保持JSON内容不变。在您的Java代码中,使用@JsonProperty注释告诉杰克逊您的Java属性的相应JSON属性名称: 公共类TransactionDTO {私有@JsonProperty(“数据”) Data[]数据;私有@JsonProperty(“链接”)链接;私有@JsonProperty(" Meta ")元数据;public Data[] getData () {返回数据;} public void setData (Data[] data) { this.data = data;}公共链接getLinks () {返回链接;} public void setLinks (链接链接){ this.links =链接;} public Meta getMeta () {返回元;} setMeta ( meta ) { this.meta = meta;} 在您的其他Java类(LinksMetaData、.)中,也采用了相同的方式

我更喜欢第一个选项,因为具有大小写的属性名是JSON和Java中公认的最佳实践。

票数 5
EN

Stack Overflow用户

发布于 2020-05-27 16:41:26

我用这个方法解决了一个类似的问题

代码语言:javascript
复制
ObjectMapper objectMapper = new ObjectMapper();

objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
票数 8
EN

Stack Overflow用户

发布于 2018-11-22 12:33:22

默认情况下,杰克逊是区分大小写的。试试这个:

代码语言:javascript
复制
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53431005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档