使用动态JsonProperty反序列化JSON对象而不使用Jackson的包装类

时间:2018-04-23 20:16:14

标签: java json jackson gson

我想重构一个应用程序,以便它使用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":[{...}]}

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

2 个答案:

答案 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行代码并解决更多问题。