如何在java中验证JSON对象?

时间:2015-08-16 18:33:09

标签: java json validation rules

我使用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我可以配置验证所需的规则?

4 个答案:

答案 0 :(得分:12)

您可以使用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对象针对此模式进行验证时,它将确保价格不应为零,它应该大于零并且应该是一个数字。如果在价格中传递字符串或零或一些负值,则验证将失败。

答案 1 :(得分:0)

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;
        }

答案 2 :(得分:0)

通常json模式似乎过大了。我的口味很复杂而且笨拙,添加更多规则会使情况变得更糟。

我认为在validol库中采用一种更简单但仍是声明性的方法可能是一个不错的选择。要点是将业务规则绑定到它们所应用的数据。复杂的规则装饰着更基本的规则。整个验证树表示单个功能声明式表达式。此外,这种方法鼓励您将验证逻辑放在特定的user scenario中。

以下是其外观的一个示例。 考虑要验证的架构:

{
   "where":{
      "building":1,
      "street":"Red Square"
   }
}

验证逻辑反映了json模式的结构。所有约束都在结构本身中描述。 所有平凡的检查(例如json键是否存在)都已得到解决。

在这里:

/*1 */        new FastFail<>(
/*2 */            new IsJsonObject(
/*3 */                new WellFormedJson(
/*4 */                    new IndexedValue("where", jsonString)
                      )
                  ),
/*7 */            whereJsonElement ->
/*8 */                new NamedBlocOfNameds<>(
/*9 */                    "where",
/*10*/                    List.of(
/*11*/                        new AsString(
/*12*/                            new Required(
/*13*/                                new IndexedValue("street", whereJsonElement)
                                  )
                              ),
/*16*/                        new AsInteger(
/*17*/                            new Required(
/*18*/                                new IndexedValue("building", whereJsonElement)
                                  )
                              )
                          ),
/*22*/                    Where.class
                )
        )
            .result();

可惜的是stackoverflow不支持行号,但是无论如何,这是一行一行的事情。

Line 1:整个验证都是一件快速失败的事情,如果第一个参数导致错误,则返回错误。
Line 4:第一个参数是where块的声明。
Line 3:它必须是格式正确的json。
Line 2:此外,它应该是json对象。
Line 7:第二个参数是闭包。它的第一个参数是where json对象。
Line 8:这里是命名元素的命名块。
Line 9:其名称为where
Line 10:第二个参数是所有元素的列表。
Line 13:第一个元素是street
Line 12:这是必需的。
Line 11:并且应表示为字符串。
Line 18:第二个是building
Line 17:这也是必需的。
Line 16:并且应表示为整数。
Line 22:如果先前的所有检查均成功,则会创建一个Where对象。 它的第一个参数是street,它必须是一个String;第二个是building,必须为整数。

看看quick-start section,了解更多示例和逐行代码分析。

答案 3 :(得分:-11)

使用以下方式打印JSON对象:

Log.e("JSON OBJECT CREATED:", jsonobject.toString());

然后在线使用json验证器来验证json。