当前位置: 首页 > 知识库问答 >
问题:

Json模式库和Java验证[closed]

漆雕正奇
2023-03-14

我可以看到有一些库生成Json模式和其他可以验证的模式。请您推荐一些库(有示例和活动库),可以在Java中提供这两种功能。我正在寻找阿帕奇许可库。

我尝试过Jackson和Gson。
Gson既不支持json模式创建,也不支持验证。
Jackson支持json模式生成,但不完全支持(例如,它不支持json模式中的默认值)

问候,

共有1个答案

尤飞尘
2023-03-14

GSON和Jackson的主要作用域是处理将数据序列化/反序列化到JSON/从JSON反序列化。JSON模式的生成和验证都不是他们(主要)关心的问题。

根据对您的另一个问题(如何使用Jackson在JSON模式中显示默认值)的评论,模式生成有两个备选方案--这同样适用于它们的验证。

根据r.groote的回答,您可以在https://json-schema.org/implementations.html上找到其中的一些(但不是全部)--这两个库都是生成库和验证库。

就我个人而言,到目前为止我只使用过networknt/json-schema-validator,并且发现它非常直观和易于使用。它暗中使用了Jackson,这在我的用例中是实用的,因为我已经使用了同一个库来(de)序列化来自JSON/到JSON的数据--所以更少额外的依赖。

免责声明:这里是偏颇的部分,因为我是victools/jsonSchema-generator的创建者。

JSON模式生成库的一个示例是victools/jsonschema-generator。这也在内部使用了Jackson,因此与networknt/json-schema-validator类似。

SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2019_09, OptionPreset.PLAIN_JSON);
configBuilder.forFields().withDefaultResolver(field -> {
    JsonProperty annotation = field.getAnnotationConsideringFieldAndGetter(JsonProperty.class);
    return annotation == null || annotation.defaultValue().isEmpty() ? null : annotation.defaultValue());
});
SchemaGenerator generator = new SchemaGenerator(configBuilder.build());
JsonNode jsonSchema = generator.generateSchema(YourClass.class);

System.out.println(jsonSchema.toString());

此外,如果您希望对Jackson注释进行更具体的处理,那么还可以考虑添加可选的victools/jsonschema-module-jackson

通过victools/jsonschema-generator,您可以完全控制默认值的来源。一种可能的方法是从所遇到的相应对象的实际实例中查找默认值--这里通过您自己的包进行筛选以跳过外部类型。
以下只是一个可能的粗略示例:

ConcurrentMap<Class<?>, Object> instanceCache = new ConcurrentHashMap<>();
configBuilder.forFields().withDefaultResolver(field -> {
    Class<?> declaringClass = field.getDeclaringType().getErasedType();
    if (!field.isFakeContainerItemScope()
            && declaringClass.getName().startsWith("your.package")) {
        MethodScope getter = field.findGetter();
        if (getter != null) {
            try {
                Object instance = instanceCache.computeIfAbsent(declaringClass, declaringClass::newInstance);
                Object defaultValue = getter.getRawMember().invoke(instance);
                return defaultValue;
            } catch (Exception ex) {
                // most likely missing a no-args constructor
            }
        }
    }
    return null;
});
 类似资料:
  • 我有一个用例,我将把一个json-schema作为输入,验证它,然后保存在我的系统中。稍后,我将获取json数据,我需要使用上面提到的json-schema来验证这些数据。给定这个场景,我需要执行两个级别的验证: 我使用的是json-schema-validator jar,只能找到第二级验证,在文档中找不到json-schema验证。例如:假设我们有以下示例json-schema:

  • 这是要根据模式验证的JSON。 问题是,如果我们传递了错误的数据,它将正确地验证eid和ename的类型(即整数或字符串)。对于例如: 如果我们为限定传递了错误的类型,那么它将验证为true(即,它不验证限定的类型,可能是因为它是嵌套的)。

  • 我对根据JSON模式验证JSON文档不感兴趣。我想验证JSON模式本身,检查它是否针对特定草案有效。是否有工具Java可以验证模式本身?

  • 问题内容: 我正在为返回JSON对象的Java Web应用程序编写一些验收测试。我想验证返回的JSON是否针对架构进行了验证。有人可以为此建议任何工具吗? 问题答案: 该 JSON工具项目 (程序员指南)包括验证使用JSON模式的JSON文件的内容的工具。 另一种选择是使用Rhino验证运行(JavaScript) JSON Schema Validator 。

  • 我试图使用另一个JSON模式来验证JSON模式。 要验证的JSON模式示例:https://jsonschema.net/home 验证上述模式的验证模式参考:https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-draft-07.json 从上面的中,如果我删除,我的JSON将变得无效。 我有什么方法可以定义根

  • 我在验证JSON时遇到了一些错误。我无法理解这些错误,有人能帮我解释一下吗。 } 这是json。 消息:JSON与“anyOf”中的任何模式都不匹配。架构路径: 消息:无效类型。应为数组,但得到的是字符串。架构路径: 消息:值“标识”载体“未在枚举中定义。架构路径: 消息:字符串“uui # abb 0 ef 56-8562-4056-aa62-AFB 758 a 150 ad”未根据格式“uri