【问题标题】:Jackson - Mapping an Object type field of json representation of class1 to class2Jackson - 将class1的json表示的对象类型字段映射到class2
【发布时间】:2016-05-02 11:08:00
【问题描述】:

我定义了两个 POJO:

Class1 -

public class Class1 {

        Map<String, Object> param1 = new HashMap<String, Object>();
        Map<String, Object> param2 = new HashMap<String, Object>();
        Object body;

        // getters-setters...
}

Class2 -

public class Class2   {

  private String name = null;
  private String description = null;
  private List<Integer> data = new ArrayList<Integer>();

  // getters-setters...
  }

body 字段是动态的,因此我将其设为 Object 类型。我在运行时使用swagger codegen 生成 Class2 Pojo。所以基本上body 对象代表Class2。 Class1 是固定类,所有字段都是已知的。

json -
{
  "param1" : {
    "id" : 132
  },
  "param2" : {
    "address" : "String"
  },

  "body" : {
    "name" : "value",
    "description" : "value",
    "data" : [ ]
  }
}

我可以为 Class1 反序列化上面的 json :

ObjectMapper mapper = new ObjectMapper();
Class1 ij = mapper.readValue(new File(path_of_above_json), Class1.class);
param1 = ij.getParam1();
param2 = ij.getParam2();
Object body = ij.getBody();

我想将 body 字段映射到 Class2。我可以用 gson 做同样的事情:

Class2 body1 = new Class2();
Gson gson = new GsonBuilder().registerTypeAdapter(Class2.class, new ResponseBodyDeserializer<Class2>()).create();
ObjectMapper mapper = new ObjectMapper();
InputStream in = MainClass.class.getResourceAsStream(path_of_above_json);
BufferedReader r = new BufferedReader(new InputStreamReader(in));
body1 = gson.fromJson(r , Class2.class);

带有附加类 ResponseBodyDeserializer -

class ResponseBodyDeserializer<T> implements JsonDeserializer<T>
{
    @Override
    public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
        throws JsonParseException
    {
        // Get the element from the parsed JSON
        JsonElement content = je.getAsJsonObject().get("body");

        // Deserialize it
        return new Gson().fromJson(content, type);
    }
}

我们可以用杰克逊实现同样的事情,以避免这个额外的课程吗?

谢谢!

【问题讨论】:

    标签: java json jackson gson


    【解决方案1】:
    public static class Class1<T> {
        private Map<String, Object> param1 = new HashMap<String, Object>();
        private Map<String, Object> param2 = new HashMap<String, Object>();
        private T body;
    }
    

    并像这样使用它:

    ObjectMapper mapper = new ObjectMapper();
    Class1<Class2> ij =  mapper.readValue(json, new TypeReference<Class1<Class2>>() {});
    Map<String, Object> param1 = ij.getParam1();
    Map<String, Object> param2 = ij.getParam2();
    Class2 body = ij.getBody();
    

    【讨论】:

      【解决方案2】:

      这是修改后的代码,

          public class Class1<T> {
      
                  Map<String, Object> param1 = new HashMap<String, Object>();
                  Map<String, Object> param2 = new HashMap<String, Object>();
                  T body;
      
                  // getters-setters...
          }
      
          ObjectMapper mapper = new ObjectMapper();
          Class1 ij = mapper.readValue(new File(path_of_above_json), Class1<Class2>.class);
          param1 = ij.getParam1();
          param2 = ij.getParam2();
      
      Class2 body1 = ij.getBody();
      

      【讨论】:

      • 感谢回复,我不能通过 Class1.class 作为参数。给出错误Class1 can not be resolves to a variable
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2018-01-12
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多