【问题标题】:Best way to decode JSON string to Java object?将 JSON 字符串解码为 Java 对象的最佳方法?
【发布时间】:2017-01-08 04:47:32
【问题描述】:

我有一个将接收不同 JSON 格式的 ServerEndpoint。由于每种消息类型只允许使用一个消息处理程序,因此我的一个解码器必须将消息转换为相应的 Java 对象。

在我的解码器中,我尝试使用 ObjectMapper 类将收到的消息转换为 SubClassA 或 SubClassB(实现相同的接口)。 ObjectMapper 类有一个 readValue 方法,该方法需要我尝试将 json 映射到的类型,并且当它无法转换为指定类型时会抛出异常。

我目前正在解码它,但它不是很优雅。

@Override
public Message decode(String message) throws DecodeException {
    ObjectMapper mapper = new ObjectMapper();

    try {
        SubclassA obj = mapper.readValue(message, SubclassA .class);
        return obj;
    } catch (IOException e) {
    }

    try {
        SubclassB obj = mapper.readValue(message, SubclassB .class);
        return obj;
    } catch (IOException e) {
    }

    throw new DecodeException(message, "Failed to decode message.");
}

使用 ObjectMapper 将 JSON 字符串解码为相应的 Java 对象的最佳方法是什么?

【问题讨论】:

标签: java websocket jackson decoder objectmapper


【解决方案1】:

Jackson 是在 Java 中使用 JSON 的最佳选择之一。

对于多态反序列化,请考虑以下几点:

【讨论】:

  • StdDeserializer 看起来很有趣,看起来很有效。不幸的是,SubclassA 没有唯一的字段。
  • @dalawh SubclassASubclassB 长什么样子?
  • SubClassA 和 SubClass B 扩展了不同的类,但实现了相同的接口。
【解决方案2】:

使用 Jackson,您可以为父对象声明子类型。您的 Json 将包含带有子类型名称的 @type,请看这篇文章 Deserialize JSON with Jackson into Polymorphic Types - A Complete Example is giving me a compile error

【讨论】:

  • 是否可以在 JSON 中不包含类型并且仍然可以使用?
  • 这是不可能的,你也可以通过实施重试策略来反序列化具有不同类的对象。第二个选项是添加带有类名的字段,并在反序列化期间获取类名并读取 Json
  • 黑客是我目前正在使用的,我一点也不喜欢。
  • 然后使用 Jackson 方法
  • 我无法修改 JSON,因为我在某种程度上无法控制传入的消息
猜你喜欢
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2021-08-24
  • 1970-01-01
  • 2010-09-30
相关资源
最近更新 更多