多态对象的JSON使用者

我正在解析JSON,并且遇到一种结构可能具有三种形式之一的困难。在我的情况下,它可以是零维,一维或二维。有什么方法可以即时检查JSON以确定它是哪一个?或者,无论如何都要消耗掉它,然后算出它到底是什么。

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

"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总是会匹配的通用类。

诸如翻译之类的东西:

{

"SomeField": "SomeValue",

...

"details":{

...

}

}

进入:

class MyClass {

String SomeField;

...

AClass details;

}

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

回答:

感谢Eric的评论,使我指向了程序员,我设法破解了它。这是我使用的代码(为了简化而简化)。

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使用者 的全部内容, 来源链接: utcz.com/qa/397925.html

回到顶部