检查两个 JSON 模式在语义上是否相同

问题描述 投票:0回答:1

我们会在每次构建应用程序时从 Java 模型自动生成 JSON 模式,并在特定 CI/CD 管道运行时自动发布该模式。我们需要对架构进行版本控制,并且架构版本与应用程序版本不同。

Schema 版本是在我们的应用程序代码中手动维护的;每当我们更改模型时,我们都需要手动增加常量中定义的模式版本。最终,每个模式版本都将作为 our-schema-x.y.json 发布到网站。

为了避免在不更新模式版本的情况下意外更改 Java 模型(以及模式),我们希望将之前发布的模式与新生成的模式进行比较,如果它们在语义上不同,则构建失败。

我们只关心结构模式更改,例如添加或删除允许的属性、允许的属性(枚举)值的更改……允许更新属性描述等非结构更改,在这种情况下,我们将更新已发布的属性架构版本。

问题是如何基于将模式反序列化为 Jackson JsonNode 实例来最好地执行此类比较:

  • 默认的基于 Jackson 的比较会忽略属性顺序,所以我们不需要担心这个
  • 默认的基于 Jackson 的比较考虑了数组顺序。我想对于枚举数组,我们应该显式忽略数组顺序,那么其他采用数组值的 JSON 模式字段呢?
  • 我们可以在比较之前删除描述字段。是否有任何其他 JSON 模式字段可能会发生更改而不影响模式描述的 JSON 结构?
  • 还有其他需要特别注意的注意事项/特定 JSON 架构属性吗?
java json jackson jsonschema
1个回答
0
投票

由于您已经根据应用程序代码自动生成架构,我假设您可以控制架构中的详细信息级别。

一种可能的方法是生成单个模式版本的两种变体:完整的版本(带有描述、验证提示等)和简化的版本(仅关注结构)。 进行任何更改后,将生成新的简化模式。如果它与现有的简化模式相同,则模式版本可以保持原样。否则,需要增加模式版本,并且可以用新的模式替换简化的参考模式。


哪些属性可以安全忽略,哪些属性不能一般性地回答,并且还取决于您所针对的架构草稿版本。

  • 至少应该考虑像
    oneOf
    /
    anyOf
    /
    allOf
    /
    not
    /
    if
    /
    then
    /
    else
    这样的结构属性,
  • 以及明显的
    type
    properties
    items
    definitions
    /
    $defs
    $ref
    属性,
  • 可能有更高级的属性,例如
    dependencies
    dependentSchemas
    $anchor
    $recursiveAnchor
    $recursiveRef
  • 以及相关的,如
    additionalProperties
    unevaluatedProperties
    patternProperties
    unevaluatedItems
    prefixItems
    contains
    propertyNames
  • 是否应包括在内的验证,例如,例如,
    const
    enum
    required
    dependentRequired
    minimum
    maxLength
    minProperties
    maxItems
    ,..,.. .
    您已经说过
  • uniqueItems
  • description
    title
    之类的可以忽略。上面的一些验证属性可能也是如此。
    
        
© www.soinside.com 2019 - 2024. All rights reserved.