java - 使用 Jackson 使用动态 JsonProperty 反序列化 JSON 对象,无需包装类

标签 java json jackson gson

我想重构一个应用程序,以便它使用 REST 而不是 EJB3Factory,而 EJB3Factory 本来就不需要,只会给新服务器带来麻烦。

基本上我有一个类(class)请求:

public class Request {
    public String name;
    public String id;
    public List<? extends someObject> list;

    // default constructor
    ...

    // non-default constructor
    public Request(String name, String id, List<T> list) {
        this.name = name;
        this.id = id;
        this.list = list;
    }

Request 被创建并使用 Gson 制成 Json 对象:

Gson gson = new Gson();
String payload = gson.toJson(Request);

然后将其发送到服务器上的 REST API。 jackson 将其反序列化。我无权访问那里的 Jackson 实现,也无法将其更改为 Gson。

我现在基本上想做的是让 Jackson 使用非默认构造函数来反序列化对象。我知道我可以像这样注释非默认构造函数:

@JsonCreator    
public Request(@JsonProperty("name") String name, @JsonProperty("id") 
        String id, @JsonProperty("list") List<T> list) {
    this.name = name;
    this.id = id;
    this.list = list;
}

问题是,list 的字段名称是在每次反射运行时设置的,生成的 Gson 对象可能将其作为 scenarioName1 来表示其中一个和 scenarioName2 用于其他内容。

我已经查看了 Stack Overflow 上提供的不同解决方案,但没有一个可以为我的问题提供解决方案。 This似乎最有帮助,但我在任何情况下都不能使用包装器属性,也不能实际映射所有可能性。

有人知道吗?

编辑以包含示例:

示例 1:

{"name":"someName","id":"first","someScenarioName":[{...}]}

示例 2:

{"name":"someOtherName","id":"second","differentScenarioName":[{...}]}

由于我出差在外,这是我现在能做的最好的事情。它基本上是最后一个字段,根据事先选择的场景,具有不同的名称。

最佳答案

也许你可以尝试看看 Mapper Features 。真诚地,我还没有尝试过,因为我在工作等等,但我现在会发送我的示例,也许它可以帮助你:

public class Request {
   public String name;
   public String id;
   public List<? extends T> list;

   // default constructor
   ...

   // non-default constructor
   public Request(String name, String id, List<T> list) {
      this.name = name;
      this.id = id;
      this.list = list;
   }
}

然后反序列化对象:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.USE_ANNOTATIONS, false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.readValue(json, Request.class);

我的尝试是因为默认情况下通过注释进行反序列化是正确的,但是一旦你大多数时候没有“列表”对象,它就不会在那里找到该字段。

关于java - 使用 Jackson 使用动态 JsonProperty 反序列化 JSON 对象,无需包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49989296/

相关文章:

java - 在 Derby 客户端驱动程序中提供连接超时

java - 从 byte[] 转换为 int 时得到错误的数字

c# - Serilog 不产生预期的 json

php - 如何获取一个类的所有公共(public)属性作为json?

Java 可选 Null Json 字段

android - 从 Gson 更改为 Jackson 进行 JSON 解析

java - 使用 STL/POSIX 将二进制文件从 J2SE 加载到 iOS iphone

java - 图:将双向边建模为两条单独的边有哪些优缺点?

javascript - HTML 5 历史 - window.pushState 不工作

java - 为什么 YAMLGenerator 不关闭流取决于配置