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

空手道DSL:如何检查JSON对象是否是可选的,但是如果该对象中的键应该是正确的模式?

司马飞
2023-03-14

我想验证一个JSON模式,其中嵌套JSON响应中的对象是可选的,但如果该对象出现,则该对象中的键也应该出现。

样本回应:-

{
    "id" : "1234",
    "targetPhoneNumber" : "1234",
    "paid" : { //optional
      "units" : "asd", //mandatory if the paid object is coming
      "amount" : 12.00 //mandatory if the paid object is coming
    },
    "date" : "2019",
    "boolean" : false,
    "transactionId" : "1234"
  }

我需要对这些案例进行模式检查。

1) 如果付费对象即将到来,它应该是一个JSON对象,并且应该包含字符串形式的单位和强制的金额。2) 如果付费对象仍不存在,则模式验证应通过。

共有2个答案

微生俊
2023-03-14

可以使用条件语句来执行此操作:

* def outerMatcher =
"""
{
"id" : "#string",
"targetPhoneNumber" : "#string",
"paid" : "##object",
"date" : "#string",
"boolean" : "#boolean",
"transactionId" : "#string"
}
"""

* def paidMatcher =
"""
{
  "units": "#string",
  "amount": "#number"
}
"""

* def innerMatcher = karate.match(response.paid, "#object").pass ? paidMatcher : "#notpresent"

* match response == outerMatcher
* match response.paid == innerMatcher
申屠昌胤
2023-03-14

结合“自我”验证表达式karate.match(实际的,预期的)应用编程接口给出了实现这一点的一些方法,

这应该行得通,

* def schema =
"""
{
      "boolean": "#boolean",
      "date": "#string",
      "id": "#string",
      "paid": "##object? karate.match(_,{\"amount\": \"#number\",\"units\": \"#string\"}).pass",
      "targetPhoneNumber": "#string",
      "transactionId": "#string"
}
"""

如果您不想添加子模式内联/如果子模式太大,您可以尝试以下方法

* def passSchema =
"""
{
    "amount": "#number",
    "units": "#string"
}
"""
* def schema =
"""
{
    "boolean": "#boolean",
    "date": "#string",
    "id": "#string",
    "paid": "##object? karate.match(_,passSchema).pass",
    "targetPhoneNumber": "#string",
    "transactionId": "#string"
}
"""

简单的JSON模式:

{
      "boolean": "#boolean",
      "date": "#string",
      "id": "#string",
      "paid": "##object? karate.match(_,{\"amount\": \"#number\",\"units\": \"#string\"}).pass",
      "targetPhoneNumber": "#string",
      "transactionId": "#string"
}
 类似资料:
  • 问题内容: 在python中,如何检查对象是否为生成器对象? 试试这个- 给出错误- (我知道我可以检查对象是否具有将其用作生成器的方法,但是我想以某种方式可以确定任何对象的类型,而不仅仅是生成器。) 问题答案: 您可以从以下类型使用GeneratorType:

  • 问题内容: 我正在使用PHP读取JSON数据,并且该数据包含空对象(如)。所以问题是,我必须以不同的方式处理对象为空但无法找到足够好的方法进行检查的情况。看起来太吓人了,效率很低。有没有好的检查方法? 问题答案: 您要反序列化多少个对象?除非事实证明或强制转换是主要的放慢速度/瓶颈,否则我不会担心– Greg的解决方案就可以了。 不过,我建议在解码JSON数据时使用标志: 这会将JSON对象解码为

  • 上面是我正在处理的JSON对象。我想检查键是否存在。我尝试了下面的代码,但它不起作用。有办法实现吗?

  • 问题内容: 我有一个需要循环通过的嵌套JSON对象,每个键的值可以是String,JSON数组或另一个JSON对象。根据对象的类型,我需要执行不同的操作。有什么方法可以检查对象的类型以查看它是String,JSON对象还是JSON数组? 我尝试使用和,但似乎都没有用,因为这将为JSON对象和数组都返回一个对象,并且在我这样做时给出错误。 更具体地说,在将JSON解析为JS对象之后,有什么方法可以检

  • 问题内容: 我的服务器端代码返回一个值,该值成功时为json对象,失败时为字符串’false’。现在如何检查返回的值是否为json对象? 问题答案: 如果字符串是JSON,则jQuery.parseJSON()应该返回类型为“对象”的对象,因此您只需使用以下命令检查类型

  • 我有一个需要循环的嵌套JSON对象,每个键的值可以是字符串、JSON数组或其他JSON对象。根据对象的类型,我需要执行不同的操作。是否有任何方法可以检查对象的类型,以查看它是字符串、JSON对象还是JSON数组? 我尝试使用和,但两者似乎都不起作用,因为将为JSON对象和数组返回一个对象,并且当我执行时,会给出一个错误。 更具体地说,在将JSON解析为JS对象后,是否有任何方法可以检查它是普通字符