【问题标题】:Deserialize JSON to POJO using type from JSON object使用 JSON 对象中的类型将 JSON 反序列化为 POJO
【发布时间】:2018-03-03 18:49:23
【问题描述】:

我正在尝试使用多态类型的杰克逊将 JSON 解析为 POJO。

我有以下 JSON,我想将其反序列化为 POJO。 我创建了包装类来解析所有 JSON 值,但我遇到了“geometry”和“geometryType”对象的问题。

我为每种几何类型创建了 POJO,我想使用“geometryType”中的值来根据“geometryType”的值将“geometry”中的值解析为不同的 Java 类。例如:如果 geometryType = 'geometryPolygon' 那么我想将“几何”解析为 Polygon 类。

我知道它可以通过注释 @JsonTypeInfo 并使用属性为我的 POJO 选择正确的子类型,但在我的情况下,“类型”实际上是在不同的对象中,而不是在同一个 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 类示例:

class Polygon extends Geometry { ... }
class Polyline extends Geometry {...}

【问题讨论】:

    标签: json jackson pojo json-deserialization


    【解决方案1】:

    看看JsonTypeInfo.As.EXTERNAL_PROPERTY的例子

    与 PROPERTY 类似的包含机制,除了属性在层次结构中包含更高一级,即作为与 JSON 对象相同级别的同级属性来键入。请注意,此选项只能用于属性,不能用于类型(类)。尝试将其用于类将导致基本 PROPERTY 的包含策略。

    // 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;
    

    见:

    【讨论】:

      【解决方案2】:

      您可以使用这个神奇的工具将您的 JSON 转换为 POJO。 http://www.jsonschema2pojo.org/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-02
        • 2017-05-13
        • 2017-08-09
        • 2017-12-19
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 2012-04-07
        相关资源
        最近更新 更多