java - jackson 反序列化对象或数组

标签 java json jackson

我有一个 jackson 问题。

有没有办法反序列化一个可能有两种类型的属性,对于某些对象,它看起来像这样

"someObj" : { "obj1" : 5, etc....}

然后对于其他人来说它显示为一个空数组,即

"someObj" : []

感谢任何帮助!

谢谢!

最佳答案

编辑:从 Jackson 2.5.0 开始,您可以使用 DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_EMPTY_OBJECT 来解决您的问题。

Bruce 提供的解决方案有一些问题/缺点:

  • 您需要为需要以这种方式反序列化的每种类型复制该代码
  • 应该重用 ObjectMapper,因为它缓存序列化器和反序列化器,因此创建起来很昂贵。参见 http://wiki.fasterxml.com/JacksonBestPracticesPerformance
  • 如果您的数组包含一些值,您可能希望让 jackson 反序列化它失败,因为这意味着它在编码时出现问题,您应该尽快看到并修复它。

这是我针对该问题的“通用”解决方案:

public abstract class EmptyArrayAsNullDeserializer<T> extends JsonDeserializer<T> {

  private final Class<T> clazz;

  protected EmptyArrayAsNullDeserializer(Class<T> clazz) {
    this.clazz = clazz;
  }

  @Override
  public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    ObjectCodec oc = jp.getCodec();
    JsonNode node = oc.readTree(jp);
    if (node.isArray() && !node.getElements().hasNext()) {
      return null;
    }
    return oc.treeToValue(node, clazz);
  }
}

然后您仍然需要为每种不同的类型创建一个自定义反序列化器,但这更容易编写并且您不会复制任何逻辑:

public class Thing2Deserializer extends EmptyArrayAsNullDeserializer<Thing2> {

  public Thing2Deserializer() {
    super(Thing2.class);
  }
}

然后你照常使用它:

@JsonDeserialize(using = Thing2Deserializer.class)

如果您找到摆脱最后一步的方法,为每种类型实现 1 个自定义反序列化器,我洗耳恭听;)

关于java - jackson 反序列化对象或数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8305565/

相关文章:

java - 从 IWorkspaceRoot 和位置字符串获取 IFile

java - 使用objectmapper解析多态对象

java - jackson 有条件的@JsonUnwrapped

java - 在 springboot 反序列化器中包含带有 jackson 的根对象

java - Junit @Rule 和 Maven Checkstyle 插件

java - 在 Jcreator 中添加 jar

java - 从批处理文件调用java - 如何拆分JVM和主方法参数?

.net - WCF 返回未实时找到端点

javascript - 如何在 Javascript 中减少 JSON 解析对象原型(prototype)?

ios - iOS 获取请求的最佳实践