我想重构一个应用程序,以便它使用 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/