如何在Java中验证JSON对象?

2022-09-02 13:10:42

我使用 sf.json 库在 Java 的 Web 应用程序中映射传入请求的表单数据。

假设传入的请求与表单数据 http://localhost:8080/app/addProfile 为:

formData: {  
   "name":"applicant Name",
   "Age":"26",
   "academics":{  
      "college":"80",
      "inter":"67",
      "matriculation":"89"
   },
   "skill":{  
      "computer":"c,c++,java",
      "maths":"limit,permutation,statistics"
   },
   "dateOfBirth":"09-07-1988"
}

服务器端 :

String requestFormData=request.getParameter("formData");
JSONObject formData = JSONObject.fromObject(requestFormData);
String name= formData.getString("name");

if(name.length>70){
//error message for length validation
}

if(!name.matches("regex for name"){
//error message for name validation
}
...
...
...

这种方法的主要问题是,如果结构中有微小的修改,那么整个代码都需要修改。JSON

是否有任何API可以配置验证所需的规则?


答案 1

您可以使用 Json 验证程序: - https://github.com/fge/json-schema-validator

或者,您可以简单地尝试使用Google Gson解析Json并捕获语法异常以验证它,如下所示:-

try{
JsonParser parser = new JsonParser();
parser.parse(passed_json_string);
} 
catch(JsonSyntaxException jse){
System.out.println("Not a valid Json String:"+jse.getMessage());
}

对于通用数据验证,请在 Json 架构中定义规则,然后仅针对此架构验证传入的 Json。
在模式中,您可以定义它可以包含的值的类型,范围等。
对于模式生成,您可以使用在线工具,如:- http://jsonschema.net/#/

您可以参考这篇文章,以快速了解json架构:- http://json-schema.org/example1.html

示例:-

"price": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        }

上面的代码定义了Json模式中的价格,当Json对象针对此模式进行验证时,它将确保价格不应该为零,它应该大于零,它应该是一个数字。如果在 price 中传递字符串或零或某个负值,则验证将失败。


答案 2
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;    
/**
         * 
         * @param inputJosn
         * @return
         * @throws IOException 
         * @throws JsonParseException 
         * @throws JsonProcessingException
         */
        private static boolean isJsonValid(String inputJosn) throws JsonParseException, IOException  {
            ObjectMapper mapper = new ObjectMapper();
            mapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
            JsonFactory factory = mapper.getFactory();
            JsonParser parser = factory.createParser(inputJosn);
            JsonNode jsonObj = mapper.readTree(parser);
            System.out.println(jsonObj.toString());


            return true;
        }