首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有正则表达式的JSONAssert进行JSON验证

使用带有正则表达式的JSONAssert进行JSON验证
EN

Stack Overflow用户
提问于 2016-08-08 07:19:35
回答 3查看 4.8K关注 0票数 5

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

代码语言:javascript
复制
Expected JSON:
{
"objectId": "[^\\s]",
"protocol": "[^\\s]",
"hostName": "[^\\s]",
"port": "[^\\s]",
"commParams": "[^\\s]"
}

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

代码语言:javascript
复制
Actual JSON:
{
"objectId": "controller2",
"protocol": "ftp",
"hostName": "sdnorchestrator",
"port": "21",
"commParams": "username:tomcat, password:tomdog"
}

Problem1: JSON的哪个接口,我需要用它来解决上面的问题:下面一个?

代码语言:javascript
复制
JSONAssert.assertEquals("Expected JSON", "Actual JSON" new CustomComparator(
    JSONCompareMode.LENIENT_ORDER, new Customization(PREFIX, new        RegularExpressionValueMatcher<Object>())));

问题2:这里的前缀应该是什么?(我试着用"",“”,“但是没有成功”)

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

EN

回答 3

Stack Overflow用户

发布于 2018-09-19 14:01:02

如果希望全局应用正则表达式自定义JSONAssert,则可以使用path = "***"构造单个Customization,并使用不带参数的RegularExpressionValueMatcher构造函数。

示例:

代码语言:javascript
复制
final String expectedJson = "{objectId: \"[^\\s]+\", protocol: \"[^\\s]+\"}";
final String actualJson = "{\"objectId\": \"controller2\", \"protocol\": \"ftp\"}";

JSONAssert.assertEquals(
    expectedJson,
    actualJson,
    new CustomComparator(
        JSONCompareMode.LENIENT,
        new Customization("***", new RegularExpressionValueMatcher<>())
    )
);

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

票数 4
EN

Stack Overflow用户

发布于 2016-09-29 10:49:32

我发现更好的alternative.Usage of JsonSchema验证器可以解决大部分问题(http://json-schema.org/)。在预期的响应中编写json模式,并使用json验证器jar验证它。( (json-schema/json-schema-validator-2.0.1.jar.zip( 166k)

票数 1
EN

Stack Overflow用户

发布于 2017-06-02 23:58:47

除了RE,我也找不到通往其他地方的路。最终,我超越了compareValues of DefaultComparator,强迫它将RegularExpressionValueMatcher应用于所有路径:

代码语言:javascript
复制
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); }
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38823339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档