如何使用 Jackson 将字符串反序列化为自定义对象?

2024-03-27

我有一个想要解析的 JSON:

{
 "name": "john",
}

我必须使用以下层次结构。这些类是不可变的,我必须通过静态工厂方法访问它们(这是必要的,因此建议对其中任何一个进行修改都是没有意义的Name or Person).

class Name {
  static Name valueOf(String name) {...}
  private Name() {}
  String name();
}
class Person {
  static Person create(Name name) {...}
  private Person() {...}
  Name name();
}

为此,我想反序列化Person和杰克逊一起,所以我写了这个:

public class NameJsonDeserializer extends JsonDeserializer<Name> {
  @Override public Name deserialize(JsonParser parser, DeserializationContext context) {
    var tree = parser.getCodec().readTree(parser);
    var name = tree.asToken().asString();
    return Name.valueOf(name);
  }
}
public class PersonJsonDeserializer extends JsonDeserializer<Person> {
  @Override public Person deserialize(JsonParser parser, DeserializationContext context) {
    var tree = parser.getCodec().readTree(parser);
    var name = (ObjectNode) tree.get("name");
    return Person.create(name);
  }
}

但当然,这是行不通的。它甚至无法编译。

我知道我可以写类似下面的东西,但是Name到处都可以使用,但并不总是在一个范围内使用Person,所以我真的需要一个单独的解串器Name.

var tree = parser.getCodec().readTree(parser);
var name = (TextNode) tree.get("name");
return Person.create(Name.valueOf(name.asText()));

如何在不借助中间 POJO 的情况下进行反序列化?


我必须使用parser.getValueAsString() for NameDeserializer and codec.treeToValue() for PersonDeserializer:

public class NameJsonDeserializer extends JsonDeserializer<Name> {
  @Override public Name deserialize(JsonParser parser, DeserializationContext context) {
    var name = parser.getValueAsString();
    return Name.valueOf(name);
  }
}
public class PersonJsonDeserializer extends JsonDeserializer<Person> {
  @Override public Person deserialize(JsonParser parser, DeserializationContext context) {
    var codec = parser.getCodec();
    var tree = codec.readTree(parser);
    
    var name = codec.treeToValue(tree.get("name"), Name.class);

    return Person.create(name);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Jackson 将字符串反序列化为自定义对象? 的相关文章

随机推荐

  • SQL查询-过滤掉仅包含空格的字段

    我需要编写一个 sql 查询来过滤掉字段中空格数量不断变化的行 例如 我有这个查询 SELECT MEMO SYSTEM TXT FROM EE dbo EE Billing Memo where MEMO SYSTEM TXT is no
  • Rails 验证类型日期?

    我想我可能是在做梦 但我想我在某处读到可以在保存对象之前验证对象属性的类型 某物 喜欢validates transaction date type gt Date这将确保它是一个约会 这在 Rails 3 2 中可能吗 我正试图在网上找到
  • 如何将模型数据从一个控制器传递到另一个控制器

    将模型数据从一个控制器传递到另一个控制器是否可能 我想将模型数据从一个控制器传递到另一个控制器 HttpPost public ActionResult Personal StudentModel student return Redire
  • MATLAB中如何将图像分成块?

    我有一个 256x256 的图像 我想将其分为 4 个 128x128 的块 并将它们寻址为 A1 到 A4 现在我想分别调用它们并对它们进行一些操作 我知道这可以使用blkproc功能 但具体是怎样的呢 我打电话吗blkproc像这样 B
  • 将 Watch 应用程序启动到中间视图

    基本上 我的应用程序以页面格式布局 我希望它启动到三个页面的中间 无法设置上一页的转场 所以我一直在尝试用代码来做到这一点 我将主视图设置为第一个视图 并且我尝试了多种方法来在应用程序启动后立即切换到中间视图 这是我尝试过的两种方法 if
  • R 保留数据框中每个日期的前 10 行

    我有一个按日期排序的股票数据数据集 然后按该日期的回报率从最大到最小排序 每天大约有800只股票 我如何创建一个新的数据框架 其中仅包含每天收益最高的 10 只股票 所以我需要每个日期的前 10 名 其他的我不关心 dplyr 是你的朋友
  • 如何使用 Twilio Java SDK 发送批量短信?

    我找到了大量关于如何使用 Js Python PHP SDK 发送大量短信的信息 但没有任何关于如何使用 Js Python PHP SDK 发送大量短信的信息如何使用 Java 实现这一点 以下是演示 Python 实现的代码片段 fro
  • 一段时间后 Adb 停止检测我的手机

    我正在 Linux 机器上为 android 开发 并且我已经创建了一个udevandroid 规则并且它有效 一段时间后 如果我拔掉设备并再次插入 adb如果我运行则无法识别该设备lusb or dmesg获取有关设备的信息 我尝试重新加
  • EA Sparx 查询中的WITH 子句

    是否可以在 EA Sparx 查询中使用WITH 子句 我写了这个 with Activities as select t connector start object id as Object2 id t object from t ob
  • 如何启用 python repl 自动完成并仍然允许新行选项卡

    我目前有以下内容 pythonrc在 python repl 中启用自动完成 Autocompletion import rlcompleter readline readline parse and bind tab complete 然
  • ASP.NET 中的会话超时

    我正在 IIS 6 0 中运行 ASP NET 2 0 应用程序 我希望会话超时为 60 分钟 而不是默认的 20 分钟 我做了以下事情 Set
  • 如何计算张量流中张量 A 沿张量 B 指定的权重的轴的加权平均值?

    我正在尝试对 RNN 输出应用加权平均方案 RNN输出用张量表示A有维度 a b c 我可以简单地采取tf reduce mean A axis 1 得到张量C有维度 a c 但是 我想做张量的 加权平均值 A along axis 1 权
  • 使用 Emacs 或 VIM 的 Colemak 键盘 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我一直在待办事项清单上划掉一些事情 我最近拿起了 Colemak 接下来我想学习Vim或Emacs 我倾向于 Vim 但它的好处之一是坚持主行 有了
  • Android 5-5.1 (API 21-22) 上的 WebView 崩溃 Resources$NotFoundException: 字符串资源 ID #0x2040002

    我正在将 Android 应用程序从 API 27 更新到 API 29 我注意到在尝试在基于 5 0 和 或 5 1 的模拟器上渲染 WebView 时发生崩溃 在运行 6 0 或更高版本 API 23 29 的模拟器上不会发生此问题 我
  • 如何实现和维护多个actionListener

    好的 我有一个类 我们称之为 MenuBarClass 其中包含多个 Menu 和 MenuItem 我想为每个 MenuItem 分配一个动作侦听器 但是 而不是执行以下操作 menuitem 1 addActionListener ne
  • 包内初始化订单

    我有文件 main a go b go c go a go package main import fmt func init fmt Println a func main b go package main import fmt fun
  • 如何在mininet中将不同的交换机连接到不同的遥控器?

    我想将 mininet 虚拟网络的不同交换机连接到不同的远程控制器 但不知道如何继续 请提供任何方法来做到这一点 任何 python 示例都值得赞赏 我推荐你阅读此邮件形式为 mininet 的邮件列表档案 https mailman st
  • 单实例登录实现

    我在我的项目 在 ASP NET 2 0 中构建的 Web 应用程序 中遇到了一个严重的问题 如下所述 假设我已经给出了用户 ID singh nirajan 并且用户说 User1 使用该用户 ID 登录到系统 现在我的要求是每当其他用户
  • javascript 将 int 转换为 float

    我有一个变量 var fval 4 现在我想输出为 4 00 JavaScript 只有一个Number存储浮点值的类型 没有 int Edit 如果要将数字格式化为小数点后两位数字的字符串 请使用 4 toFixed 2
  • 如何使用 Jackson 将字符串反序列化为自定义对象?

    我有一个想要解析的 JSON name john 我必须使用以下层次结构 这些类是不可变的 我必须通过静态工厂方法访问它们 这是必要的 因此建议对其中任何一个进行修改都是没有意义的Name or Person class Name stat