我想重构一个应用程序,以便它使用REST而不是首先不需要的EJB3Factory,只会使新服务器出现问题。
基本上我有一个课程申请:
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实现,也无法将其更改为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
表示为{1}}而scenarioName2
表示其他内容
我已经看过Stack Overflow提供的不同解决方案,但没有一个能为我提供解决方案。 This似乎最有帮助但我在任何情况下都不能使用包装器属性,也无法实际映射所有可能性。
有人有任何想法吗?
编辑以包含示例:
示例1:
{"name":"someName","id":"first","someScenarioName":[{...}]}
示例2:
{"name":"someOtherName","id":"second","differentScenarioName":[{...}]}
因为我出差在外,这是我现在能做的最好的事情。它基本上是具有不同名称的最后一个字段,具体取决于事先选择的场景。
答案 0 :(得分:1)
也许您可以尝试查看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);
我的尝试是因为默认情况下注释的反序列化是正确的,但是一旦你没有&#34;列表&#34;大部分时间都是对象,它不会在那里找到那个领域。
答案 1 :(得分:0)
好的,所以我弄清楚我的问题是什么。课堂上还有其他列表,这些都是麻烦。在用@JsonProperty("theirRespectiveName")
注释每一个之后,它就像一个魅力......现在我需要注释大约100行代码并解决更多问题。