gpt4 book ai didi

java - jackson 延迟反序列化字段

转载 作者:行者123 更新时间:2023-12-04 04:49:48 25 4
gpt4 key购买 nike

我有一个这样的类(class):

public class DeserializedHeader
int typeToClassId;
Object obj

我知道什么类型的对象 obj 基于 typeToClassId,不幸的是只有在运行时才知道。

我想根据 typeToClassId 解析 obj - 这里最好的方法是什么?注释似乎已经过时了,基于 ObjectMapper 的东西似乎是正确的,但我无法弄清楚最好的方法可能是什么。

类似的东西
类 clazz = lookUpClassBasedOnId(typeToClassId)
objectMapper.readValue(obj, clazz)

显然,这不起作用,因为 obj 已经反序列化了......但是我可以以某种方式分两步完成,也许使用 convertValue?

最佳答案

这真是一个复杂而痛苦的问题。我不知道任何复杂而优雅的解决方案,但我可以与您分享我开发的想法。我已经创建了示例程序,可以帮助我向您展示如何解决您的问题。一开始我创建了两个简单的 POJO 类:

class Product {

private String name;

// getters/setters/toString
}


class Entity {

private long id;

// getters/setters/toString
}

这些类的示例输入 JSON 可能如下所示。对于 Product类(class):
{
"typeToClassId" : 33,
"obj" : {
"name" : "Computer"
}
}

Entity类(class):
{
"typeToClassId" : 45,
"obj" : {
"id" : 10
}
}

我们要使用的主要功能是“部分序列化/反序列化”。为此,我们将启用 FAIL_ON_UNKNOWN_PROPERTIES 功能在 ObjectMapper .现在我们必须创建两个定义 typeToClassId 的类。和 obj属性。
class HeaderType {

private int typeToClassId;

public int getTypeToClassId() {
return typeToClassId;
}

public void setTypeToClassId(int typeToClassId) {
this.typeToClassId = typeToClassId;
}

@Override
public String toString() {
return "HeaderType [typeToClassId=" + typeToClassId + "]";
}
}

class HeaderObject<T> {

private T obj;

public T getObj() {
return obj;
}

public void setObj(T obj) {
this.obj = obj;
}

@Override
public String toString() {
return "HeaderObject [obj=" + obj + "]";
}
}

最后是可以解析 JSON 的源代码:
// Simple binding
Map<Integer, Class<?>> classResolverMap = new HashMap<Integer, Class<?>>();
classResolverMap.put(33, Product.class);
classResolverMap.put(45, Entity.class);

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

String json = "{...}";

// Parse type
HeaderType headerType = mapper.readValue(json, HeaderType.class);
// Retrieve class by integer value
Class<?> clazz = classResolverMap.get(headerType.getTypeToClassId());
// Create dynamic type
JavaType type = mapper.getTypeFactory().constructParametricType(HeaderObject.class, clazz);
// Parse object
HeaderObject<?> headerObject = (HeaderObject<?>) mapper.readValue(json, type);
// Get the object
Object result = headerObject.getObj();

System.out.println(result);

有用的链接:
  • How To Convert Java Map To / From JSON (Jackson) .
  • java jackson parse object containing a generic type object .
  • 关于java - jackson 延迟反序列化字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17605524/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com