JSON 在 Java 中与 Jackson 的数据映射
JSON data mapping in Java with Jackson
我被困在仅使用 Jackson 装饰器以“简单的方式”将 json 映射到我的数据结构中,我想知道是否有办法做到这一点...
我尝试阅读的json具有以下结构:
{
"animals": [
{"data_info":{"ns":"dog"}, "sound":"bowwow", "bites":True},
{"data_info":{"ns":"dog"}, "sound":"woofWoof", "bites":False},
{"data_info":{"ns":"cat"}, "sound":"meeeOwww", "age":5}
],
"data_info":{"ns":"animal"}
}
所以基本上每个数据实体都有一个“data_info”对象(在我的代码中从下面映射到 DataTypeInfo),它有一个 属性“ns”对象(在我的代码 TypeInfo 中映射)包含对象类型。所以这意味着对象类型的鉴别器总是在 data_info.ns
这是我的数据实体:
public class Animals extends DataTypeInfo {
@JsonProperty("animals")
List<Mamals> animals;
}
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "data_info.ns")
@JsonSubTypes({
@JsonSubTypes.Type(value = Cat.class, name = "cat"),
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
})
public abstract class Mamals extends DataTypeInfo {
}
public class Cat extends Mammals {
@JsonProperty("sound")
private String sound;
@JsonProperty("age")
private in age;
}
public class Dog extends Mammals {
@JsonProperty("sound")
private String sound;
@JsonProperty("bites")
boolean bites
}
public class DataTypeInfo {
@JsonProperty("data_info")
TypeInfo typeInfo;
}
public class TypeInfo {
@JsonProperty("ns")
String nameSpace;
}
我的代码中的错误来自哺乳动物 class 的鉴别器:属性 = "data_info.ns" 因为这是为了处理属性,但我尝试使用子 属性 ...
有没有办法正确声明 Mammal 抽象的鉴别器 class 以便实例化正确的 Dog 或 Cat 对象?
我最终得到的解决方案是在摘要中使用自定义生成器 (JsonCreator) class(对于上述哺乳动物的示例)。
我更新的哺乳动物 class 看起来像这样:
@JsonCreator
public static Mammals create(Map<String,Object> jsonMap) throws JsonProcessingException {
Mammals result;
Map type_info = (Map<String,String>) jsonMap.get("data_info");
String type = (String) type_info.get("ns");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(jsonMap);
if (type.equals("cat")) {
result = mapper.readValue(json, Cat.class);
} else if (type.equals("dog")) {
result = mapper.readValue(json, Dog.class);
} else {
throw new RuntimeException("Unknown entity type");
}
return result;
}
由于我的根 class(动物)包含一个哺乳动物列表,对于此列表的每个元素,都会执行此创建器以构建适当的哺乳动物实例(在我的示例中为猫或狗)。
我被困在仅使用 Jackson 装饰器以“简单的方式”将 json 映射到我的数据结构中,我想知道是否有办法做到这一点...
我尝试阅读的json具有以下结构:
{
"animals": [
{"data_info":{"ns":"dog"}, "sound":"bowwow", "bites":True},
{"data_info":{"ns":"dog"}, "sound":"woofWoof", "bites":False},
{"data_info":{"ns":"cat"}, "sound":"meeeOwww", "age":5}
],
"data_info":{"ns":"animal"}
}
所以基本上每个数据实体都有一个“data_info”对象(在我的代码中从下面映射到 DataTypeInfo),它有一个 属性“ns”对象(在我的代码 TypeInfo 中映射)包含对象类型。所以这意味着对象类型的鉴别器总是在 data_info.ns
这是我的数据实体:
public class Animals extends DataTypeInfo {
@JsonProperty("animals")
List<Mamals> animals;
}
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "data_info.ns")
@JsonSubTypes({
@JsonSubTypes.Type(value = Cat.class, name = "cat"),
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
})
public abstract class Mamals extends DataTypeInfo {
}
public class Cat extends Mammals {
@JsonProperty("sound")
private String sound;
@JsonProperty("age")
private in age;
}
public class Dog extends Mammals {
@JsonProperty("sound")
private String sound;
@JsonProperty("bites")
boolean bites
}
public class DataTypeInfo {
@JsonProperty("data_info")
TypeInfo typeInfo;
}
public class TypeInfo {
@JsonProperty("ns")
String nameSpace;
}
我的代码中的错误来自哺乳动物 class 的鉴别器:属性 = "data_info.ns" 因为这是为了处理属性,但我尝试使用子 属性 ... 有没有办法正确声明 Mammal 抽象的鉴别器 class 以便实例化正确的 Dog 或 Cat 对象?
我最终得到的解决方案是在摘要中使用自定义生成器 (JsonCreator) class(对于上述哺乳动物的示例)。
我更新的哺乳动物 class 看起来像这样:
@JsonCreator
public static Mammals create(Map<String,Object> jsonMap) throws JsonProcessingException {
Mammals result;
Map type_info = (Map<String,String>) jsonMap.get("data_info");
String type = (String) type_info.get("ns");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(jsonMap);
if (type.equals("cat")) {
result = mapper.readValue(json, Cat.class);
} else if (type.equals("dog")) {
result = mapper.readValue(json, Dog.class);
} else {
throw new RuntimeException("Unknown entity type");
}
return result;
}
由于我的根 class(动物)包含一个哺乳动物列表,对于此列表的每个元素,都会执行此创建器以构建适当的哺乳动物实例(在我的示例中为猫或狗)。