使用来自 JSON 对象的类型将 JSON 反序列化为 POJO
Deserialize JSON to POJO using type from JSON object
我正在尝试使用具有多态类型的 jackson 将 JSON 解析为 POJO。
我有以下 JSON,我想将其反序列化为 POJO。
我已经创建了包装器 classes 来解析所有 JSON 值,但是我对 "geometry" 和 "geometryType" 对象有问题。
我已经为每种类型的几何创建了 POJO,我想使用 "geometryType" 中的值将 "geometry" 中的值解析为不同的 Java class 取决于 "geometryType" 的值。例如:如果 geometryType = 'geometryPolygon' 那么我想将 "geometry" 解析为 Polygon class.
我知道可以使用注释 @JsonTypeInfo 并使用 属性 为我的 POJO 选择正确的子类型,但在我的例子中,"type" 实际上在不同的对象中,而不是在与我在网上看到的所有其他教程相同的 JSON 对象中。
我们将不胜感激。
{
"results": [{
"layerId": 3,
"layerName": "Parcels",
"displayFieldName": "LAND_CO",
"value": "0",
"attributes": {
"Feature identifier": "6",
"SHAPE": "Polygon",
"PROPERTY_I": "5006",
"LANDUSE_CO": "0",
"ZONING": "1",
"PARCEL_ID": "6363",
"Res": "Non-Residential",
"Zoning_simple": "Null",
"SHAPE_Length": "3594.570779",
"SHAPE_Area": "112648.196175"
},
"geometryType": "geometryPolygon",
"geometry": {
"rings": [[[-85.802587291351813, 32.394007668298649], .........]]
}
}
]
}
POJO 示例 classes:
class Polygon extends Geometry { ... }
class Polyline extends Geometry {...}
查看带有 JsonTypeInfo.As.EXTERNAL_PROPERTY
的示例
Inclusion mechanism similar to PROPERTY, except that property is included one-level higher in hierarchy, i.e. as sibling property at same level as JSON Object to type. Note that this choice can only be used for properties, not for types (classes). Trying to use it for classes will result in inclusion strategy of basic PROPERTY instead.
// Polygon and Polyline extends Geometry.
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "geometryType")
@JsonSubTypes({
@JsonSubTypes.Type(name = "geometryPolygon", value = Polygon.class),
@JsonSubTypes.Type(name = "geometryPolyline", value = Polyline.class),
....})
private Geometry geometry;
参见:
您可以使用这个神奇的工具将您的 JSON 转换为 POJO。
http://www.jsonschema2pojo.org/
我正在尝试使用具有多态类型的 jackson 将 JSON 解析为 POJO。
我有以下 JSON,我想将其反序列化为 POJO。 我已经创建了包装器 classes 来解析所有 JSON 值,但是我对 "geometry" 和 "geometryType" 对象有问题。
我已经为每种类型的几何创建了 POJO,我想使用 "geometryType" 中的值将 "geometry" 中的值解析为不同的 Java class 取决于 "geometryType" 的值。例如:如果 geometryType = 'geometryPolygon' 那么我想将 "geometry" 解析为 Polygon class.
我知道可以使用注释 @JsonTypeInfo 并使用 属性 为我的 POJO 选择正确的子类型,但在我的例子中,"type" 实际上在不同的对象中,而不是在与我在网上看到的所有其他教程相同的 JSON 对象中。
我们将不胜感激。
{
"results": [{
"layerId": 3,
"layerName": "Parcels",
"displayFieldName": "LAND_CO",
"value": "0",
"attributes": {
"Feature identifier": "6",
"SHAPE": "Polygon",
"PROPERTY_I": "5006",
"LANDUSE_CO": "0",
"ZONING": "1",
"PARCEL_ID": "6363",
"Res": "Non-Residential",
"Zoning_simple": "Null",
"SHAPE_Length": "3594.570779",
"SHAPE_Area": "112648.196175"
},
"geometryType": "geometryPolygon",
"geometry": {
"rings": [[[-85.802587291351813, 32.394007668298649], .........]]
}
}
]
}
POJO 示例 classes:
class Polygon extends Geometry { ... }
class Polyline extends Geometry {...}
查看带有 JsonTypeInfo.As.EXTERNAL_PROPERTY
的示例Inclusion mechanism similar to PROPERTY, except that property is included one-level higher in hierarchy, i.e. as sibling property at same level as JSON Object to type. Note that this choice can only be used for properties, not for types (classes). Trying to use it for classes will result in inclusion strategy of basic PROPERTY instead.
// Polygon and Polyline extends Geometry.
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "geometryType")
@JsonSubTypes({
@JsonSubTypes.Type(name = "geometryPolygon", value = Polygon.class),
@JsonSubTypes.Type(name = "geometryPolyline", value = Polyline.class),
....})
private Geometry geometry;
参见:
您可以使用这个神奇的工具将您的 JSON 转换为 POJO。 http://www.jsonschema2pojo.org/