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

解析JSON并委托给JsonDeserializer中的defaultDeserializer

况浩邈
2023-03-14

为了反序列化map,我需要读取json对象中的一个属性。

我添加了一个定制的反序列化器,它解析json并在一个上下文属性中设置找到的类型。该属性稍后在第二个反序列化器中使用,该反序列化器反序列化用户的自定义映射。

不幸的是,这个解决方案失败了,因为我正在更改jsonParser的当前令牌。因此,defaultDeserializer无法继续解析响应。

导致原因:com.fasterxml.jockson.databind.dese.BeanDeserializer.deserialize(UserDeserializer.java:36)处com.sfasterxml处的java.lang.NullPointerException

@Override
public User deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {

    JsonNode node = jsonParser.readValueAsTree();
    JsonNode typeNode = node.get("type");
    String typeName = schemaNode.get("name").textValue();
    ctxt.setAttribute("typeName", typeName);

    User userResponse = (User) defaultDeserializer.deserialize(jsonParser, ctxt);
    return userResponse;

}

我的json是这样的:

{
  "username": "test",
  "type": { "name": "testtype" },
  "map": { "test": 1234 }
}

有没有办法重置json解析器或使用其他解析器?或者是否可以使用特定的 JsonNode 进行反序列化?

更改json不是一个选项。

共有2个答案

慕烨烁
2023-03-14

您可以改用对象映射器

@Override
public User deserialize(String jsonString) throws IOException, JsonProcessingException {

    ObjectMapper objectMapper = new ObjectMapper();

    User user = objectMapper.readValue(jsonString, User.class);

    return user;

}

或者使用对象映射器并从其设置器填充用户(如果有)。

@Override
public User deserialize(String jsonString) throws IOException, JsonProcessingException {

    ObjectMapper objectMapper = new ObjectMapper();
    HashMap<String, Object> map = new HashMap<String, Object>();

    map = objectMapper.readValue(jsonString, HashMap.class);
    User user = new User();
    user.setUsername(map.get("username"));
    user.setType(map.get("type"));
    user.setMap(map.get("map"));

    return user;
}
温翔宇
2023-03-14

我现在使用不同的方法。可以像这样获取当前的JsonNode:

    JsonNode rootNode = jsonParser.readValueAsTree();

底层json可以通过以下方式获取:

    rootNode.toString().

在构建JsonDeserializer期间,我将引用存储到另一个nodemapper。然后我使用此映射器反序列化剩余的json:

    mapper.readValue(rootNode.toString());
 类似资料:
  • 本文向大家介绍C#委托delegate实例解析,包括了C#委托delegate实例解析的使用技巧和注意事项,需要的朋友参考一下 所谓c#的委托就是说把函数当参数来传递。 这个在js完全就用不着搞什么委托东西,直接转就是了。而对于C#来说则不是这样! 一个函数,如果它的参数是函数,那么是这样子写的 : 意思是说这个将被传进来的函数是一个没有return的函数,就是public void, 它需要一个

  • 本文向大家介绍C#中委托和事件的区别实例解析,包括了C#中委托和事件的区别实例解析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下: 大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。 一、通过委托

  • 问题内容: 我想知道,当我在Reddit线程中发现问题时,为什么要委托给。提到的代码片段如下所示(JDK 7u25): Math.java : StrictMath.java : 第二项声明对我来说是合理的。状态文档指出: 鼓励代码生成器使用特定于平台的本机库或微处理器指令(如果可用)(…) 问题是 :实现平台特定的本机库不够吗?除了已安装的JRE,JIT还可以了解有关平台的更多信息(请仅关注这种

  • 我的一个项目使用Spring MVC来处理URL映射和调度逻辑。我现在必须使用一个第三方库,该库使用它自己的作为其功能的主要入口点,但由于它是另一个库的可选插入替换,所以我不能仅仅将声明放在web.xml中:我宁愿使用和Spring配置文件在这样的实现之间切换,而不必编辑web.xml。 Spring是否提供了任何服务来处理此类案件?我好像没有马上找到。 提前道谢!

  • 主要内容:类委托,属性委托,标准委托,可观察属性 Observable,把属性储存在映射中,Not Null,局部委托属性,属性委托要求,翻译规则,提供委托委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口

  • 主要内容:声明委托,实例化委托,多播委托(合并委托)C# 中的委托(Delegate)类似于 C 或 C++ 中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。委托特别适用于实现事件和回调方法,所有的委托都派生自 System.Delegate 类。在实例化委托时,可以将委托的实例与具有相同返回值类型的方法相关联,这样就可以通过委托来调用方法。另外,使用委托还可以将方法作为参数传递给其他方法, 委托具有以下特点: 委托类似