具有 POJO 的 anyOf 字段的 Json 架构

Liu*_*hen 5 java pojo jsonschema jackson jsonschema2pojo

我想知道为具有“anyOf”字段的 Json 模式生成 POJO 的推荐方法是什么?

例如,给定以下 json 模式:

爱好.json
{
    "anyOf": [
        { "type": {"$ref": "./exercise.json" } },
        { "type": {"$ref": "./music.json" } }
    ]    
}
Run Code Online (Sandbox Code Playgroud) 练习.json
{
    "type": "object"
    "properties" {
        "hobbyType": {"type": "string"}
        "exerciseName": { "type": "string" },
        "timeSpent": { "type": "number" },
        "place": { "type": "string" }
    }
}
Run Code Online (Sandbox Code Playgroud) 音乐.json
{
    "type": "object"
    "properties" {
        "hobbyType": {"type": "string"}
        "instrument": { "type": "string" },
        "timeSpent": { "type": "number" }
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何为Hobby.javaJackson 生成 POJO?

Liu*_*hen 0

我最终采用的方法是使用 Jackson 提供的多态编组/解组功能。

具体来说 -

  1. 做成一个接口并用andhobby注释@JsonTypeInfo@JsonSubTypes
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    property = "hobbyType",
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    visible = true
)
@JsonSubTypes({
        @Type(value = Exercise.class, name = "exercise"),
        @Type(value = Music.class, name = "music")
})
public interface Hobby {
}
Run Code Online (Sandbox Code Playgroud)
  1. 创建Exercise.javaMusic.java实现该接口
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    property = "hobbyType",
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    visible = true
)
@JsonSubTypes({
        @Type(value = Exercise.class, name = "exercise"),
        @Type(value = Music.class, name = "music")
})
public interface Hobby {
}
Run Code Online (Sandbox Code Playgroud)
  1. 用于Hobby序列化和反序列化。
// create a Hobby object
Hobby exercise = Exercise.builder().exerciseName("swimming").place("swimmingPool").build();

// serialization
String serializedHobby = new ObjectMapper.writeValueAsString(exercise)
/**
serializedHobby looks like this ->
{
    "hobbyType": "exercise",
    "exerciseName": "swimming",
    "place": "swimmingPool"
}
*/

// deserialization
Hobby deserializedObject = new ObjectMapper.readValue(jsonString, Hobby.class)
// deserializedObject.getClass() would return Exercise.java or Music.java based on the hobbyType

Run Code Online (Sandbox Code Playgroud)

参考: https: //www.baeldung.com/jackson-inheritance