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

如何在java中验证JSON对象?

胡桐
2023-03-14

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

共有3个答案

皮弘博
2023-03-14

通常情况下,json模式似乎有些过分。这对我来说是相当复杂和笨拙的,增加更多的规则会让事情变得更糟。

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

下面是一个它可能看起来像什么的例子。考虑要验证的模式:

{
   "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不支持行号,但是,不管怎样,这是一行一行的情况。

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

有关更多示例和逐行代码分析,请参阅快速入门部分。

王楚青
2023-03-14
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;
        }
湛联
2023-03-14

您可以使用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中传递了字符串、零或某个负值,则验证将失败。

 类似资料:
  • 问题内容: 我使用sf.json库在Java Web应用程序中映射传入请求的表单数据。 可以说传入请求是http:// localhost:8080 / app / addProfile ,其表单数据为: 服务器端 : 这种方法的主要问题是,如果对结构进行少量修改,则需要修改整个代码。 有没有可以配置验证所需规则的api? 问题答案: 您可以使用Json验证器:-https: //github.c

  • 问题内容: 有没有办法在不使用PHP的情况下检查变量是否为有效的JSON字符串?我没有PHP 5.3.3。 问题答案:

  • 问题内容: 这是我第一次在laravel中使用验证。我正在尝试对以下json对象应用验证规则。json对象名称是有效负载,下面给出示例。 验证码如下所示,出于测试目的,我将数字验证为数字。当我执行以下代码时,上面的json对象被批准并插入到我的数据库中。相反,它应该给我一个例外,因为我正在传递带有字母数字值的名称,是我做错了什么: 问题答案: 请这样 验证中的字段必须是数字,并且必须具有确切的值长

  • 在给定的json文档中,如何验证是否存在json路径? 我使用的是jayway jsonpath,代码如下 上述代码可能会引发以下异常 通用域名格式。乱穿马路。jsonpath。PathNotFoundException:路径:$['a.b.c']没有结果 为了缓解这种情况,我打算在尝试使用JsonPath读取该路径之前验证该路径是否存在。阅读 作为参考,我看了以下两个文档,但没有真正得到我想要的

  • 我不知道如何正确设置超架构以使用json架构验证器。我使用的是json模式验证器的java版本,版本是2.2.5。 我的模式是: 我的 json 对象是: 现在,当我将模式加载到并打算开始验证时,我得到以下警告: 除了$Schema字段之外,还有什么要配置以使用超模式的吗?