【发布时间】:2019-03-04 06:30:15
【问题描述】:
这是一个相当奇怪的问题。我正在集成测试 Grails 服务和相关的域类。该域类的一个属性是包含 JSON 的 String。数据库字段也是json,并且有一个自定义的 Hibernate 值类型可以执行必要的转换。它已经在另一个领域类的生产环境中工作了多年。
class MyDomain {
String data
static mapping = {
data type: StringJsonUserType
}
}
到目前为止一切顺利。在我的测试中,我将一个输入对象模拟到我的服务方法中,最终将包含并返回所需的 JSON 字符串。
private MockedClass mockClass() {
// JsonRepresentable declares asJson() method.
def data = GroovyMock(JsonRepresentable)
data.asJson() >> "{\"content\":\"irrelevant\"}"
def mockClass = GroovyMock(MockedClass)
mockClass.getData() >> data
return mockClass
}
服务方式(简体):
void persist(MockedClass mock) {
String string = mock.data.asJson()
def domain = new MyDomain(data: mock.data.asJson())
domain.save()
}
当我使用调试器进入这段代码时,我可以立即看到字符串已从 string 变量中的 {"content":"irrelevant"} 变为 domain 变量中的 "{\"content\":\"irrelevant\"}"。
现在唯一合乎逻辑的是,在我的测试中,保存的域类字符串的比较与模拟输入不匹配。
这是从数据库中读取MyDomain.data 数据时的样子:
"\"\\\"{\\\\\\\"content\\\\\\\":\\\\\\\"irrelevant\\\\\\\"}\\\"\""
这是用new JsonSlurper().parseText(MyDomain.data)解析的相同字符串:
"\"{\\\"content\\\":\\\"irrelevant\\\"}\""
这是用 JsonSlurper 解析的模拟字符串(如上):
[content:irrelevant]
显然最后一个例子是我所期望的。谁能告诉我为什么 Groovy/Grails 会在我的简单且正确转义的字符串中添加大量糟糕的 \\ ?我什至可以尝试使用 Groovy 字符串 '{"content":"irrelevant"}',但这并没有丝毫区别。
【问题讨论】: