当前位置: 首页 > 知识库问答 >
问题:

反序列化包含List<object>的Jackson/Json对象,其中列表类型是对象中的属性

纪成礼
2023-03-14

我试图反序列化一个包含列表的json对象,其中列表的类型是对象中的一个属性。即

public class TableOutput 
{
    private String hash;
    private String table;  // contains the object type in data list
    private List<Object> data;
}

我有一个限制是生成了我要反序列化的bean,我无法修改它们。我很确定我需要一个自定义的JsonDesriezer反序列化器。我把反序列化器放在数据类型上:

@JsonDeserialize(contentAs = TableOutputDeserializer.class)
private List<Object> data;

反序列化程序可以工作,但问题是我无法从父对象中获取表属性。我正在获取TableOutput对象,hash属性具有正确的值,但是table属性为null。我只是猜测,但我认为objectMapper在处理“table”属性之前先处理“data”属性。

这是我的 Json反序列化程序:

public class TableOutputDeserializer extends JsonDeserializer<Object> {
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
    // Get reference to ObjectCodec
    ObjectCodec codec = jp.getCodec();

    // Parse "object" node into Jackson's tree model
    JsonNode node = codec.readTree(jp);

    // Get the TableOutput object
    TableOutput tableOutput=(TableOutput)jp.getParsingContext().getParent().getCurrentValue();

    // got a valid tableOutput instance. 
    String objectType=tableOutput.getTable(); // objectType is always null!!!

    Iterator<JsonNode> elements = node.elements();
    ... more stuff ...

我需要能够获得表属性,这样我就知道为列表创建什么样的对象。建议?

共有1个答案

伍光济
2023-03-14

可能对对象使用泛型值。无法确定这是否适用于您的情况,但当使用GSON设置JSON对象时,我设置了一个通用类,以便在导入JSON对象的时候,我可以告诉它在List中使用什么类型的对象。有点像

public class JsonClass <T> {
  private List<T> unknownItems;
}

然后,将它与要包含在列表中的类的引用一起使用。

 类似资料:
  • 如何用jackson(Java)反序列化Object中的json对象(在我的例子中,字段中提供对象)? 输入字符串: {“header”:“OFFER”,“message”:“{”author\“:\”Peter Smith\“,\”previous\“:null,\”current\“:{”id\“:\”eOUQieQdvB\“,”authorUserId\“:\”foo\“}” {“autho

  • 问题内容: 你好(对不起我的英语) 我正在开发使用Spring SPRING MVC的json前端网站消耗Web服务的Web服务。spring mvc使用JsonIdentityInfo选项进行序列化,因此每个对象仅在json中写入一次,并且每次都使用引用进行写入,例如她使用相同的对象“ component”有2个“ computer”,因此spring将ID设置为第一个组件(“ @compone

  • 问题内容: 我必须从对象列表中序列化JSON。生成的JSON必须看起来像这样: 当我简单地将其序列化时,我缺少类型/键“模型”: 相反,我只是得到这个: 如何为每个对象添加“模型”而不必编写带有属性“模型”的傻包装类? 我的课程如下: 问题答案: 没有内置的方法可以做到这一点。您必须自己编写。就像是 然后注释该字段,以便它使用它 这将序列化为 如果要同时对此序列化和反序列化,则还需要一个自定义的反

  • 我有一个抽象的超类A,我有几个具体的子类B,C,D 在序列化方面,我执行以下操作: 没问题。我现在想反序列化这个。我知道我不能实例化一个抽象类,那么这是如何实现的呢? 这不起作用: 编辑:我把这个添加到我的抽象超类中:(仍然没有运气) 再次编辑:我现在遇到以下错误: 看看JSON,@class不在那里。我怎样才能做到?我试过: 但这并没有奏效。有这方面的例子吗?如何告诉对象映射器对类使用我的注释?

  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 我有以下控制器: 使用以下请求对象: 当帖子通过并查看我得到的对象时,有效负载列表中有LinkedHashMap对象,而不是我的DTO类型的对象。 如何让Spring jackson将JSON转换为我的DTO对象。请记住,我计划对其他对象列表重用包装器响应DTO,这就是我使用通用列表(List)的原因。 这是我正在尝试的JSON。