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

JSON jackson将不同键解析到同一字段

江航
2023-03-14

我有一个POJO,它有一个字段:

public class Media {
 private Asset asset;
}

当将一个json响应解析到这个资产POJO中时,一切工作都很完美。但是,与此资产附带的关键字有一个细微的区别。它可以是:

  @JsonProperty("cover_asset")

  @JsonProperty("asset")

有没有一种方法来注释POJO来识别这个案例并反序列化到相同的字段中。两者不可能出现在相同的答复中。

共有2个答案

鞠子轩
2023-03-14

更简洁地说,我建议为此使用两个单独的@JsonSetter注释。这里有一个工作示例。这意味着您的Java类将只有一个getter方法可用于属性,而不是两个。您还可以将不希望公开给媒体客户端的setter设置为私有的,并以特殊的方式处理其中一个json键。

import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.databind.ObjectMapper;

@SuppressWarnings("unused")
public class Media {

    private Asset asset;

    @JsonGetter("asset")
    public Asset getAsset() {
        return asset;
    }

    @JsonSetter("asset")
    public void setAsset(Asset asset) {
        this.asset = asset;
    }

    @JsonSetter("cover_asset")
    private void setMediaAsset(Asset asset) {
        if (this.asset == null) {
            setAsset(asset);
        }
    }


    private static class Asset {
        @JsonProperty("foo")
        private String foo;
    }

    public static void main(String[] args) throws Exception {
        String withAsset = "{'asset': {'foo':'bar'}}";
        String withCoverAsset = "{'cover_asset': {'foo':'bar'}}";

        ObjectMapper mapper = new ObjectMapper();
        Media mediaFromAsset = mapper.readValue(withAsset.replace('\'','"'), Media.class);
        Media mediaFromCoverAsset = mapper.readValue(withCoverAsset.replace('\'','"'), Media.class);

        System.out.println(mediaFromAsset.asset.foo.equals(mediaFromCoverAsset.asset.foo));

    }
}
雍骏俊
2023-03-14

那么,由于您只关心反序列化,所以2.9中引入的@JSONALIAS非常适合这种情况。您可以这样做:

@JsonAlias({"cover_asset", "asset"})
private Asset asset;

@jsonalias文档:

可用于定义属性的一个或多个替代名称的批注,在反序列化过程中作为正式名称的替代名称接受。别名信息也会在POJO内省过程中公开,但在始终使用主名称的序列化过程中不起作用。

注意:请确保更新所有相关依赖项(注释核心数据绑定)(如果您正在使用这些依赖项)。只更新annotations而不更新其他人会给我带来运行时错误。

 类似资料:
  • 问题内容: 我有一个POJO,其中包含一个字段: 将json响应解析到此资产POJO时,一切工作正常。但是此资产随附的密钥略有不同。可以是: 要么 有没有一种方法可以注释POJO以识别这种情况并反序列化到同一字段中。他们不可能出现在相同的响应中。 问题答案: 好吧,因为只有反序列化才是您关心的问题,所以引入in十分适合这种情况。您可以执行以下操作: docs: 可用于定义属性的一个或多个替代名称的

  • 鉴于以下类: 和以下设置: 当我尝试解析ServiceA和ServiceB时,它们都得到一个具有相同URL的HttpClient。 我如何更改DI中的注册,使每个服务都得到正确的HttpClient注入? TIA /Søren

  • 以下是我目前的尝试: 我一直在思考如何动态地向列(mpg、cyl、disp)添加(1,2,3)。提前谢了。

  • 我在ES7.8中创建了一个日期格式为“YYYY-MM-DD”的索引。 然而,当我点击地图上的“基线”字段时,在Filter上传递的实际值是yyyy-mm-dd00:00:00.000z。 有没有人可以建议一下,我怎样才能在过滤器中得到正确的日期格式“YYYY-MM-DD”? 多谢了。 下面是请求中的示例文档 “命中”:[{“_index”:“program_b”,“_type”:“_doc”,“_

  • 问题内容: 我有两张桌子和。 第一台具有与第二表有田,, 我想要一个帐户进行多少次子请求以及他进行了多少次抓取的计数(基于,如果该帐户中填充了他的) 在一个查询中 输出: 问题答案: 使用类似 诀窍是使用表两次:和,每次由不同的字段联接。 关于效率的注意事项:我不确定,但是我相信这个解决方案比子查询解决方案要快,尽管没有对其进行测试(至少不会慢一些)。只要有可能,我总是更喜欢子查询。

  • 我们正计划将Graphql用于编排(For e.用户界面客户端调用图形ql服务,该服务转到多个Restendpoint并返回结果)。这里的问题是,从一个Restendpoint,我们必须根据客户端请求的字段传递不同类型的查询参数。 我们使用Spring Bootgraphql和graphql java工具库来初始化graphql 我的代码解析用户字段并调用restendpoint,以便在一次调用(