如何为一组类型定义JSON模式

时间:2019-07-29 17:56:46

标签: java json jsonschema jsonschema2pojo

首先要进行一些背景说明。

我有一个由许多客户端和执行各种功能的服务组成的应用程序。这些软件通过相互发送消息来相互通信。此时,消息结构非常简单且很小,消息类型的总数也相当小。有可能支持表示相关信息的“类型”,可能在消息类型之间共享。

几个简单的消息类型示例:

AssessRouteCommand {
  header : HeaderType
  commandID : string
}

AssessRouteStatus {
  header : HeaderType
  commandID : string
  status : string
}

如您所见,这两个消息都具有相同类型的标头。 [ 理想情况下,我希望能够生成一个抽象的超类,所有“消息”类型都将从该超类扩展而来,但我不知道这是怎么回事(或者是否可以)使用JSON完成。 ]

HeaderType {
  timestamp : long
  securitySignature : SecuritySignatureType
}

SecuritySignatureType {
  <security-specific properties>
}

我的意图是定义一个JSON模式来定义消息类型(以及内部消息组件的任何支持类型),然后生成代表这些类型的POJO的Java类的集合。 [ 我正在使用jsonschema2pojo(http://www.jsonschema2pojo.org/)来照顾POJO的产生。这是我发现的唯一一个可以从JSON模式生成POJO类的程序包。 ]

因此,我开始为此创建一个架构,并且认为我已经正确设置了它。但是,当我运行jsonschema2pojo来执行生成步骤时,事情不太正确。一些类已达到我的预期,而另一些却没有。

以下是我的架构摘录,以供参考。

sub-types.schema.json:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://<my domain>/sub-types.schema.json",
  "type": "object",
  "definitions": {
    "security-signature": {
      "type": "object",
      "properties": {
        "algorithm": {
          "type": "string"
        },
        "key-value": {
          "type": "string"
        }
      }
    },
    "message-header": {
      "type": "object",
      "properties": {
        "timestamp": {
          "type": "number"
        },
        "security-signature": {
          "$ref": "#/definitions/security-signature"
        }
      }
    }
  }
}

message-type.schema.json:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://<my domain>/message-type.schema.json",
  "type": "object",
  "properties": {
    "header": {
      "$ref": "sub-types.schema.json#/definitions/message-header"
    }
  }
}

assess-route-command.schema.json:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://<my domain>/assess-route-command.schema.json",
  "type": "object",
  "properties": {
    "allOf": [
      {
        "$ref": "message-type.schema.json#/definitions/header"
      },
      {
        "type": "object",
        "properties": {
          "command-id": {
            "type": "string"
          }
        }
      }
    ]
  }
}

这就是最终生成的内容(为简洁起见,省略了一些生成的代码):

MessageTypeSchema.java: (注意:出于某种原因,它在类名后附加了“模式”,这不是我想要的。)

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "header"
})
public class MessageTypeSchema {
    @JsonProperty("header")
    @Valid
    private MessageHeader header;

    @JsonProperty("header")
    public MessageHeader getHeader() {
        return header;
    }

    @JsonProperty("header")
    public void setHeader(MessageHeader header) {
        this.header = header;
    }
    ...
}

MessageHeader.java: (注意:我不希望将JSON“数字”作为Java Double生成。我认为有一种方法可以控制它。)

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "timestamp",
    "security-signature"
})
public class MessageHeader {
    @JsonProperty("timestamp")
    private Double timestamp;
    @JsonProperty("security-signature")
    @Valid
    private SecuritySignature securitySignature;
    ...
}

SecuritySignature.java:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "algorithm",
    "key-value",
    "key-length",
    "sender"
})
public class SecuritySignature {
    @JsonProperty("algorithm")
    private String algorithm;
    @JsonProperty("key-value")
    private String keyValue;
    @JsonProperty("key-length")
    private Double keyLength;
    @JsonProperty("sender")
    private String sender;
    ...
}

AssessRouteCommandSchema.java: (这里的东西很糟糕。)

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "allOf"
})
public class AssessRouteCommandSchema {
    @JsonProperty("allOf")
    private Object allOf;

    @JsonProperty("allOf")
    public Object getAllOf() {
        return allOf;
    }

    @JsonProperty("allOf")
    public void setAllOf(Object allOf) {
        this.allOf = allOf;
    }
    ...
}

这根本不是我想要的。

如果任何人都可以了解我在做什么错,请告诉我。了解我是否可以影响类的命名方式以及是否可以控制为属性生成的Java类型,这也将很有帮助。

0 个答案:

没有答案