的Java / Android的 - 对字符串模式验证JSON字符串(Java/Android -

2019-07-18 16:09发布

我无法找到一个最简单的方法来验证对一个给定的JSON-模式字符串JSON字符串(供参考,这是在Java中,在一个Android应用程序运行)。

理想情况下,我想只是传递一个JSON字符串和JSON-模式字符串,它返回一个布尔值其是否通过了验证。 通过搜索,我找到了实现这一下列2个前途库:

http://jsontools.berlios.de/

https://github.com/fge/json-schema-validator

然而,第一个与似乎支持差相当过时。 我实现了库到我的项目,甚至与他们的JavaDoc,我无法告诉如何正确建立用于验证的“验证”对象。

类似的故事:第二个,这似乎是上最新与良好的测试代码。 然而,我想要做的,这是非常简单的,它似乎是为如何具体实现我想要的东西(看后甚至有点令人生畏和混乱ValidateServlet.java文件)。

好奇,如果任何人有一个很好的方式任何其他建议做到这一点(从它看起来是),简单的任务需要,或者如果我也许需要从上面的第二选择坚守? 提前致谢!

Answer 1:

实际上,这就是你链接到Servlet的做,所以它可能不是一个班轮,但它仍然是表现力。

useV4useId在servlet作为指定的,用于指定验证选项Default to draft v4Use id for addressing

你可以在网上看到: http://json-schema-validator.herokuapp.com/

public boolean validate(String jsonData, String jsonSchema, boolean useV4, boolean useId) throws Exception {
   // create the Json nodes for schema and data
   JsonNode schemaNode = JsonLoader.fromString(jsonSchema); // throws JsonProcessingException if error
   JsonNode data = JsonLoader.fromString(jsonData);         // same here

   JsonSchemaFactory factory = JsonSchemaFactories.withOptions(useV4, useId);
   // load the schema and validate
   JsonSchema schema = factory.fromSchema(schemaNode);
   ValidationReport report = schema.validate(data);

   return report.isSuccess();
}


Answer 2:

感恩感谢您对道格拉斯Crockford的和弗朗西斯Galiegue编写基于Java的JSON架构处理器! 而在线测试仪在http://json-schema-validator.herokuapp.com/index.jsp是真棒! 我真的很喜欢乐于助人的错误信息(我只发现了他们失败的一个例子),但行和列的和/或环境甚至会更好(现在,你只在JSON格式错误获得的行和列的信息(杰克逊的礼貌)。最后,我要感谢迈克尔Droettboom他的伟大的教程(即使他只涵盖的Python,Ruby和C,而明显忽略所有:-)最好的语言)。

对于那些谁错过了(像我起初),有例子是在github.com/fge/json-schema-processor-examples。 虽然这些例子都非常可观,他们不是最初要求(和我也一直在寻找)表示,简单的JSON验证的例子。 简单的例子是在github.com/fge/json-schema-validator/blob/master/src/main/java/com/github/fge/jsonschema/examples/Example1.java

Alex的代码上面并没有为我工作,但是是非常有益的; 我的POM是拉动最新的稳定版本,2.0.1版与插在我的Maven pom.xml文件下列依赖性:

<dependency>
    <groupId>com.github.fge</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>2.0.1</version>
</dependency>

然后下面的Java代码正常工作对我来说:

import java.io.IOException;
import java.util.Iterator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonNode;
import com.github.fge.jsonschema.exceptions.ProcessingException;
import com.github.fge.jsonschema.main.JsonSchema;
import com.github.fge.jsonschema.main.JsonSchemaFactory;
import com.github.fge.jsonschema.report.ProcessingMessage;
import com.github.fge.jsonschema.report.ProcessingReport;
import com.github.fge.jsonschema.util.JsonLoader;


public class JsonValidationExample  
{

public boolean validate(String jsonData, String jsonSchema) {
    ProcessingReport report = null;
    boolean result = false;
    try {
        System.out.println("Applying schema: @<@<"+jsonSchema+">@>@ to data: #<#<"+jsonData+">#>#");
        JsonNode schemaNode = JsonLoader.fromString(jsonSchema);
        JsonNode data = JsonLoader.fromString(jsonData);         
        JsonSchemaFactory factory = JsonSchemaFactory.byDefault(); 
        JsonSchema schema = factory.getJsonSchema(schemaNode);
        report = schema.validate(data);
    } catch (JsonParseException jpex) {
        System.out.println("Error. Something went wrong trying to parse json data: #<#<"+jsonData+
                ">#># or json schema: @<@<"+jsonSchema+">@>@. Are the double quotes included? "+jpex.getMessage());
        //jpex.printStackTrace();
    } catch (ProcessingException pex) {  
        System.out.println("Error. Something went wrong trying to process json data: #<#<"+jsonData+
                ">#># with json schema: @<@<"+jsonSchema+">@>@ "+pex.getMessage());
        //pex.printStackTrace();
    } catch (IOException e) {
        System.out.println("Error. Something went wrong trying to read json data: #<#<"+jsonData+
                ">#># or json schema: @<@<"+jsonSchema+">@>@");
        //e.printStackTrace();
    }
    if (report != null) {
        Iterator<ProcessingMessage> iter = report.iterator();
        while (iter.hasNext()) {
            ProcessingMessage pm = iter.next();
            System.out.println("Processing Message: "+pm.getMessage());
        }
        result = report.isSuccess();
    }
    System.out.println(" Result=" +result);
    return result;
}

public static void main(String[] args)
{
    System.out.println( "Starting Json Validation." );
    JsonValidationExample app = new JsonValidationExample();
    String jsonData = "\"Redemption\"";
    String jsonSchema = "{ \"type\": \"string\", \"minLength\": 2, \"maxLength\": 11}";
    app.validate(jsonData, jsonSchema);
    jsonData = "Agony";  // Quotes not included
    app.validate(jsonData, jsonSchema);
    jsonData = "42";
    app.validate(jsonData, jsonSchema);
    jsonData = "\"A\"";
    app.validate(jsonData, jsonSchema);
    jsonData = "\"The pity of Bilbo may rule the fate of many.\"";
    app.validate(jsonData, jsonSchema);
}

}

从上面的代码我的结果是:

Starting Json Validation.
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"Redemption">#>#
 Result=true
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<Agony>#>#
Error. Something went wrong trying to parse json data: #<#<Agony>#># or json schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@. Are the double quotes included?
 Result=false
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<42>#>#
Processing Message: instance type does not match any allowed primitive type
 Result=false
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"A">#>#
Processing Message: string is too short
 Result=false
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"The pity of Bilbo may rule the fate of many.">#>#
Processing Message: string is too long
 Result=false

请享用!



Answer 3:

@亚历克斯的答案为我工作在Android,但要求我多DEX并添加:

    packagingOptions {
        pickFirst 'META-INF/ASL-2.0.txt'
        pickFirst 'draftv4/schema'
        pickFirst 'draftv3/schema'
        pickFirst 'META-INF/LICENSE'
        pickFirst 'META-INF/LGPL-3.0.txt'
    }

build.gradle



文章来源: Java/Android - Validate String JSON against String schema