我正在解析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" ]]
}
{
"SomeField": "SomeValue",
...
"details":{
...
}
}
class MyClass {
String SomeField;
...
AClass details;
}
是否有一个类aclass
可以定义为任何JSON结构或数组的通用接收者?
多亏了Eric的评论,指点我到programmerbruce,我才设法破解了它。下面是我使用的代码(为了简化而删减)。
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,并且遇到一种结构可能具有三种形式之一的困难。在我的情况下,它可以是零维,一维或二维。有什么方法可以即时检查JSON以确定它是哪一个?或者,无论如何都要消耗掉它,然后算出它到底是什么。 这些结构看起来像这样,可以嵌入其他结构中。 我可能正在寻找的是Jackson总是会匹配的通用类。 诸如翻译之类的东西: 进入: 我是否可以定义一个可以作为任何JSON结构或数组的通用接
请帮忙。 谢谢,哈里
我有json格式,我想用JSONObject和JSONArray在java代码中创建它,但是我没有得到正确格式的输出。JSON格式如下所示。 我如何用java创建这个json对象,因为我想用这个对象创建使用NVD3的多条形图。如有任何帮助,不胜感激!
我使用Spring的return ResponseEntity来返回HTTP响应。 当在实体中传递POJO或MAP时,它将其转换为JSON对象。喜欢 结果可能是 POJO 类(获取器和二次生成器) 我正在用 现在我想要的是,我将在请求中获得响应字段列表。我只想仅使用这些字段响应请求。 对于Ex,如果我收到的响应字段为name, id。那么对象必须只包含这两个。 我不能使用@jsonignore或@
我有一个杰克逊多态性问题。我想将JSON数据反序列化为多态类型。通过阅读Jackson文档,我可以将JSON数据反序列化为多态类型。不过,我有一个特例。我有一个类结构如下: 注意:类栏除了继承的“类型”字段之外没有任何其他成员变量。 如果我传入上面的json数据,如: 我得到了类似“无法从end_token中反序列化类条”的信息。我相信这是因为JsonTypeInfo和JsonSubTypes注释
我在Deck类中创建一个问题对象列表。我读取Json文件并将其传递给String,然后简单地使用Gson创建对象列表。但那不起作用:/你有谢谢你的主意吗。这是我的Json文件: 这是我的问题构造器: 这是我的甲板建造师: 这是我的主要代码: res1是我以字符串格式获得的Json文件,因此res2应该包含一个与Json文件相关的对象列表,但列表中没有任何内容。