当前位置: 首页 > 面试题库 >

JSON延迟反序列化字段

仉嘉泽
2023-03-14
问题内容

我有这样的课:

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类:

{
  "typeToClassId" : 33,
  "obj" : {
    "name" : "Computer"
  }
}

而对于Entity班级:

{
  "typeToClassId" : 45,
  "obj" : {
    "id" : 10
  }
}

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

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
    html" target="_blank">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);

有用的网址:

  1. 如何将Java Map与JSON相互转换(杰克逊)。


 类似资料:
  • 我有这样一门课: 我知道基于typeToClassId的对象obj是什么类型,不幸的是只有在运行时才知道。 我想基于typeToClassId解析出obj——这里最好的方法是什么?注释似乎已经过时了,基于ObjectMapper的东西似乎是对的,但我很难弄清楚最好的方法可能是什么。 类似于类clazz=lookUpClassBasedOnId(typeToClassId)objectMapper的

  • 我使用Spring并创建了一个REST服务。 这是我的控制器的一部分: 该人员的角色是延迟初始化的,当时不需要。当(1)被注释掉时,所有操作都将失败 org.springframework.http.converter.HttpMessageNotWritableException:无法写入JSON:无法延迟初始化角色集合:no.something.project.Person.roles,无法初

  • 问题内容: 我正在尝试使用新的React Lazy和Suspense创建后备加载组件。这很好用,但后备时间仅显示几毫秒。有没有办法增加额外的延迟或最短时间,因此我可以在渲染下一个组件之前显示该组件的动画? 现在懒导入 等待组件: 我可以做这样的事情吗? 问题答案: 函数应该返回对象的承诺,该对象由具有默认导出功能的模块返回。不会返回承诺,也不能那样使用。尽管任意承诺可以: 如果目标是提供 最小的

  • 问题内容: 我有以下JSON字符串要反序列化: 我正在使用DataContractJsonSerializer方法。 它由项目数组组成,我找不到使用VB.Net可以反序列化此结构的示例。我具有以下Application类来存储此信息: 问题答案: 我建议你使用过。原因如下: 更快 比简单的序列化需要更多的代码。 您无需将and 属性与 使用此数据类 并使用它反序列化您的: 如果仍要使用,则可以使用

  • 我有一个简单的问题,假设我有这个json 以这种方式映射: 我想知道是否可以通过使用一些自定义setter/注释或其他东西在内部对象中保存一个外部字段: PS:由于json的复杂性,使用自定义反序列化是我最后的选择

  • 我想解析这个json文件。 {“特征”:[{“类型”:“特征”,“几何”:“{“类型”:“多边形”,“坐标”:[[26.4217861898109,40.127607984644],[26.4219934821323,40.1275230229872],[26.4218810759267,40.1273800013679],[26.4216801413981,40.1274730404221],[