Java 使用Jackson反序列化具有动态JsonProperty的JSON对象,而不使用包装器类

Java 使用Jackson反序列化具有动态JsonProperty的JSON对象,而不使用包装器类,java,json,jackson,gson,Java,Json,Jackson,Gson,我想重新构造一个应用程序,使其使用REST而不是EJB3工厂,EJB3工厂一开始并不需要,只会给新服务器带来麻烦 基本上我有一个课堂要求: public class Request { public String name; public String id; public List<? extends someObject> list; // default constructor ... // non-default const

我想重新构造一个应用程序,使其使用REST而不是EJB3工厂,EJB3工厂一开始并不需要,只会给新服务器带来麻烦

基本上我有一个课堂要求:

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;
    }
然后将其发送到服务器上的RESTAPI。在那里,杰克逊反序列化了它。我无法访问那里的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;
}
@JsonCreator
公共请求(@JsonProperty(“name”)字符串名称,@JsonProperty(“id”)
字符串id,@JsonProperty(“列表”)列表){
this.name=名称;
this.id=id;
this.list=列表;
}
问题是,
list
的字段名是在每次反射的运行时设置的,生成的Gson对象可能会将其作为一个
scenarioName1
,而作为另一个
scenarioName2

我已经看过这里提供的关于堆栈溢出的不同解决方案,但是没有一个能为我的问题提供解决方案。看起来很有帮助,但我在任何情况下都不能使用包装器属性,也不能实际映射所有可能性

有人知道吗

编辑以包含示例:

例1:

{“name”:“someName”,“id”:“first”,“someScenarioName”:[{…}]}

例2:

{“name”:“someOtherName”,“id”:“second”,“differentScenarioName”:[{…}]}


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

也许您可以试试看。诚恳地说,我还没有尝试,因为我正在工作等等,但我现在将发送我的示例,也许它可以帮助您:

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

我的尝试是因为按注释反序列化在默认情况下是正确的,但是一旦大部分时间没有“列表”对象,它就不会在那里找到字段。

好的,所以我找到了问题所在。班上还有其他的名单,这些就是问题所在。在用
@JsonProperty(“theirRespectiveName”)
注释它们之后,它就像一个符咒。。。现在我必须对大约100行代码进行注释,并解决更多问题。

您有JSON返回示例吗?这将使它更容易理解。例如:示例1->{JSON content}示例2->{otherJSON content}是的,我知道不同的场景和业务逻辑等。问题是,现在大约有40个或50个。有效的解决方案不适用。每次包含一个场景时,您已经需要调整代码中的5个位置,我不想添加到其中,因为您需要更改的每一个代码都可能会产生更多错误。我将研究ObjectMapper,thanks@KonradPuczynski但是这些动态列表中的对象是相同的吗?@KonradPuczynski我用一些发现编辑了我的答案。请看一看。不,列表中的对象也不一样,但我认为映射应该是开箱即用的,因为那里有要映射的类,它们都实现了可序列化。谢谢你的努力,我周五回办公室后会尝试一些东西。@KonradPuczynski我刚刚看到了类似的东西(或者至少对你有帮助)
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);