【问题标题】:Extract specific field from json and deserialize it according to speicific Class<?>从 json 中提取特定字段并根据特定 Class<?> 对其进行反序列化
【发布时间】:2014-08-17 03:19:26
【问题描述】:

我有一段 json 字符串,我想提取特定字段,并且该字段存在我想将其反序列化为特定类型(类)。

到目前为止,我已经尝试过使用 ObjectMapper,但它的问题在于它的设计方式是将输入 json 值映射到指定的类类型。在我的情况下,我需要从 json 字符串中取出特定字段并将它们反序列化为对象。

接下来,我尝试了 JsonParser,它提供了更多选项,因为我可以逐个字段迭代 json 字段并为每个字段调用“readValueAs”方法。这对我来说几乎是完美的,我的问题是我不想逐个字段地遍历 json,我想动态地告诉解析器要解析哪个字段,然后才将其反序列化为一个对象。

这是我想要实现的示例:

假设我有这个 json { "name" : "Bob", "age" : 21, "status" : false }

我只想提取“名称”的值 (Bob),然后将其反序列化为 java.lang.String

我该怎么做??

编辑: 我试着更好地描述我的流程: 当应用程序第一次加载时,我使用反射读取特定方法的参数,稍后当应用程序接收到 json 消息时,我想以 json 中的每个键对应于方法的一个参数的方式解析消息。所以我需要将 json 中的键值反序列化为与该参数匹配的对象。

如果您了解 JAVA-8 中的反射机制,您可以像在代码中写的那样获取参数的类型和名称!

希望这能让它更清楚......不确定:-)

【问题讨论】:

  • 您可以将您的 JSON 反序列化为 Map 或 JsonNode,然后提取必要的字段。
  • 我可以将字段作为JsonNode,但是这个类没有暴露类似的方法:public T readValueAs(Class valueType)
  • 我只知道运行时的类型,所以无法使用JsonNode的功能。
  • 您可以使用 ObjectMapper#treeToValue 方法将 JsonNode 转换为对象。
  • 感谢您的帮助,我终于找到了答案!!!做我需要的正确方法是 ObjectMapper#convertValue,它接受一个对象并返回一个 Class 类型的对象。它分两步完成:第一步将对象转换为 json 表示,第二步将其序列化为 Class.

标签: java json jackson mongo-jackson-mapper


【解决方案1】:

多亏了我的帮助,我终于找到了答案!!!

做我需要的正确方法是ObjectMapper#convertValue,它接受一个对象并返回一个Class类型的对象。它分两步完成:第一步将对象转换为 json 表示,第二步将其序列化为类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2021-05-31
    • 2018-07-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多