java - Jackson - 将 class1 的 json 表示形式的对象类型字段映射到 class2

标签 java json jackson gson

我定义了两个 POJO:

1 级 -

public class Class1 {

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

        // getters-setters...
}

2 级 -

public class Class2   {

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

  // getters-setters...
  }

body 字段是动态的,因此我将其设为对象类型。我在运行时使用 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);
    }
}

我们可以通过 Jackson 实现同样的目标,从而避免这个额外的类(class)吗?

谢谢!

最佳答案

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();

关于java - Jackson - 将 class1 的 json 表示形式的对象类型字段映射到 class2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36980988/

相关文章:

java - 如何将 JavaScript 字符串而不是 Java 字符串传递给 Nashorn 引擎?

java - Espresso 测试 NestedScrollView - "Error performing ' 滚动到 View 'with id:"

javascript - Ajax POST 返回成功,但不更新 JSON 文件

javascript - 移动 json 数组中的项目

java - 将多态对象列表反序列化为对象字段

java - 启动 Intent.ACTION_VIEW Intent 不适用于保存的图像文件

php - NSArray 无法识别我放入其中的内容并给我错误

java - Jackson:使用单个条目将字符串序列化/反序列化为数组

jackson - Wildfly 9 - 如何排除 jackson

java - 如何让 Eclipse 始终首选其他库包含的库的最新版本?