使用JSONAssert和正则表达式进行JSON验证

时间:2016-08-08 07:19:35

标签: java json jsonassert

我在一个使用REST接口的开源项目中工作。为了验证(匹配实际响应与预期)我们在JUnit中的rest接口,我们想使用JSONAssert。 (https://github.com/skyscreamer/JSONassert)。但是我的用法有问题。帮助解决它。

Expected JSON:
{
"objectId": "[^\\s]",
"protocol": "[^\\s]",
"hostName": "[^\\s]",
"port": "[^\\s]",
"commParams": "[^\\s]"
}

备注:objectId / protocol / hostName / port / commParams可以是任何内容但不应为空

Actual JSON:
{
"objectId": "controller2",
"protocol": "ftp",
"hostName": "sdnorchestrator",
"port": "21",
"commParams": "username:tomcat, password:tomdog"
}

问题1:JSON Assert的哪个界面,我需要用来解决上述问题:下面有一个?

JSONAssert.assertEquals("Expected JSON", "Actual JSON" new CustomComparator(
    JSONCompareMode.LENIENT_ORDER, new Customization(PREFIX, new        RegularExpressionValueMatcher<Object>())));

问题2:这里的PREFIX应该是什么?(我试过“”,“。,”“但没有成功)

对于上述问题的任何其他建议(JSONAssert除外)也是受欢迎的。

3 个答案:

答案 0 :(得分:1)

我找到了更好的替代方案。使用JsonSchema验证器可以解决大部分问题(http://json-schema.org/)。在预期响应中编写json模式并使用json验证器jar对其进行验证。 (json-schema / json-schema-validator-2.0.1.jar.zip(166 k))

答案 1 :(得分:1)

如果要使用JSONAssert 全局应用正则表达式自定义,则可以使用Customization构建单个path = "***",然后使用{{1}没有参数的构造函数。

示例:

RegularExpressionValueMatcher

此断言成功通过(已使用JSONassert 1.5.0版进行了测试)。

答案 2 :(得分:0)

除了RE之外,我无法获得路径。最后我只是过度使用DefaultComparator的compareValues来强制它将RegularExpressionValueMatcher应用于所有路径:

import org.json.JSONException;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareResult;
import org.skyscreamer.jsonassert.RegularExpressionValueMatcher;
import org.skyscreamer.jsonassert.ValueMatcherException;
import org.skyscreamer.jsonassert.comparator.DefaultComparator;
import static org.skyscreamer.jsonassert.JSONCompareMode.STRICT;
    ...

final RegularExpressionValueMatcher reMatcher = new RegularExpressionValueMatcher();

JSONAssert.assertEquals( "{\"key\":\"v.*\"}", "{\"key\":\"value\"}",
    new DefaultComparator( STRICT ) {

        @Override
        public void compareValues(String prefix, Object expectedValue, Object actualValue, JSONCompareResult result) throws JSONException {
            try {
                if( !reMatcher.equal(actualValue, expectedValue) ) result.fail(prefix, expectedValue, actualValue);
            } catch( ValueMatcherException e ) { result.fail(prefix, e); }
        }

    }
相关问题