多态对象的 JSON 消费者 [英] JSON consumer of polymorphic objects

查看:26
本文介绍了多态对象的 JSON 消费者的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在解析 JSON,但在使用一种可以具有三种形式之一的结构时遇到困难.就我而言,它可以是零维、一维或二维.有什么方法可以即时检查 JSON 以确定它是哪一个?或者也许无论如何都要消费它,然后弄清楚它是什么.

I am parsing JSON and am having difficulty with one structure that can have one of three forms. In my case it could be zero-dimensional, one-dimensional or two-dimensional. Is there some way I can inspect the JSON on the fly to determine which one it is? Or perhaps consume it anyway and work out what it is afterwards.

结构看起来像这样,可以嵌入到其他结构中.

The structures look like this and can be embedded in other structures.

"details":{
    "Product":"A zero-dimensional Product"
},

"details":{
    "Product":"A one-dimensional Product",
    "Dimensions": [ "Size" ],
    "Labels": [ "XS", "S", "M", "L" ]
},

"details":{
    "Product":"A two-dimensional Product",
    "Dimensions": [ "Size", "Fit" ],
    "Labels": [[ "XS", "S", "M", "L" ],[ "26", "28", "30", "32" ]]
}

我可能正在寻找的是 Jackson 将始终与之匹配的通用类.

What I may be looking for is a generic class that Jackson will always match with.

类似于翻译:

{
"SomeField": "SomeValue",
...
 "details":{
  ...
 }
}

进入:

class MyClass {
  String SomeField;
  ...
  AClass details;
}

是否有一个类 AClass 我可以定义它可以是任何 JSON 结构或数组的通用接收者?

Is there a class AClass I can define that could be a universal recipient for any JSON structure or array?

推荐答案

感谢 Eric 的评论将我指向 programmerbruce 我设法破解了它.这是我使用的代码(为了简化而减少).

Thanks to Eric's comment pointing me to programmerbruce I managed to crack it. Here's the code I used (cut down to simplify).

public static class Info {
  @JsonProperty("Product")
  public String product;
  // Empty in the 0d version, One entry in the 1d version, two entries in the 2d version.
  @JsonProperty("Dimensions")
  public String[] dimensions;

}

public static class Info0d extends Info {
}

public static class Info1d extends Info {
  @JsonProperty("Labels")
  public String[] labels;
}

public static class Info2d extends Info {
  @JsonProperty("Labels")
  public String[][] labels;
}

public static class InfoDeserializer extends StdDeserializer<Info> {
  public InfoDeserializer() {
    super(Info.class);
  }

  @Override
  public Info deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    Class<? extends Info> variantInfoClass = null;
    ObjectMapper mapper = (ObjectMapper) jp.getCodec();
    ObjectNode root = (ObjectNode) mapper.readTree(jp);
    // Inspect the `diemnsions` field to decide what to expect.
    JsonNode dimensions = root.get("Dimensions");
    if ( dimensions == null ) {
      variantInfoClass = Info0d.class;
    } else {
      switch ( dimensions.size() ) {
        case 1:
          variantInfoClass = Info1d.class;
          break;

        case 2:
          variantInfoClass = Info2d.class;
          break;
      }
    }
    if (variantInfoClass == null) {
      return null;
    }
    return mapper.readValue(root, variantInfoClass);
  }
}

并在 ObjectMapper 中安装它:

// Register the special deserializer.
InfoDeserializer deserializer = new InfoDeserializer();
SimpleModule module = new SimpleModule("PolymorphicInfoDeserializerModule", new Version(1, 0, 0, null));
module.addDeserializer(Info.class, deserializer);
mapper.registerModule(module);
factory = new JsonFactory(mapper);

这篇关于多态对象的 JSON 消费者的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆