【问题标题】:karate : Complex JSON Schema matchingkarate : 复杂的 JSON Schema 匹配
【发布时间】:2018-03-12 08:43:49
【问题描述】:

我正在尝试使用可选键验证复杂的 JSON

以下是完整的可执行Feature文件

Feature: Complex Schema
  Background:
    * def JSONtobeValidiated =
    """
    {
  "MyArray": {
    "MYinternalDetails": [
      {
        "SomeField": "dc",
        "textfield": [],
        "OptionalArray1": [
          {
            "Users": "Y",
            "IsAllowed": "Y"
          },
          {
            "Users": "Y",
            "IsAllowed": "Y"
          }
        ]
      },
      {
        "SomeField": "nb",
        "textfield": [],
        "OptionalArray2": [
          {
            "CodingP": "GZ",
            "Name": "Ok"
          },
          {
            "CodingP": "BO",
            "Name": "Saved"
          },
          {
            "CodingP": "YB",
            "Name": "Done"
          }
        ]
      },
      {
        "SomeField": "TRY",
        "textfield": []
      },
      {
        "SomeField": "cd",
        "textfield": [],
        "OptionalArray3": [
          {
            "Astring": "Lazy",
            "AnotherString": "N",
            "textfield": []
          },
          {
            "Astring": "FREE",
            "AnotherString": "N",
            "textfield": [
              {
                "title": "Name",
                "alertMessage": "Please enter valid name."
              },
              {
                "title": "Mobile No",
                "alertMessage": "Please enter mobile no."
              }
            ]
          }
        ]
      },
      {
        "SomeField": "gv",
        "textfield": [
          {
            "title": "First",
            "alertMessage": "SOme Alert"
          }
        ]
      },
      {
        "SomeField": "OTP",
        "textfield": [
          {
            "title": "Second",
            "alertMessage": "SOme other elert."
          }
        ]
      },
      {
        "SomeField": "rp",
        "textfield": [],
        "OptionalArray4": [
          {
            "Code": "ACODE",
            "textfield": []
          }
        ]
      }
    ]
  }
}
    """

    * def textfield = { title: '#string',alertMessage: '#string' }

    * def OptionalArray1 = { Users: '#string',IsAllowed: '#string' }
    * def OptionalArray2 = { CodingP: '#string',Name: '#string'}
    * def OptionalArray3 = { Astring: '#string' ,AnotherString: '#string' ,textfield: '##[] textfield'  }
    * def OptionalArray4 = { Code: '#string',textfield: '##[] textfield' }

    * def MYinternalDetails =
    """
      {
        SomeField: '#string',
        textfield: '##[] textfield',
        OptionalArray1: '#[] OptionalArray1',
        OptionalArray2: '#[] OptionalArray2',
        OptionalArray3: '#[] OptionalArray3',
        OptionalArray4: '#[] OptionalArray4',

      }

    """

    * def MYinternalDetailsTest =
    """
      {
        SomeField: '#string',
        textfield: '#ignore',
        OptionalArray1: '#ignore',
        OptionalArray2: '#ignore',
        OptionalArray3: '#ignore',
        OptionalArray4: '#ignore',
      }

    """

    * def ValidJsonSchema = { MyArray: { MYinternalDetails: '#[] MYinternalDetails' } }
    * def ValidJsonSchemaTest = { MyArray: { MYinternalDetails: '#[] MYinternalDetailsTest' } }

    Scenario: This works fine

      * match JSONtobeValidiated == ValidJsonSchemaTest
      * match JSONtobeValidiated.MyArray.MYinternalDetails == '#[] MYinternalDetailsTest'


  Scenario: This should work
      * match JSONtobeValidiated.MyArray.MYinternalDetails == '#[] MYinternalDetails'

  Scenario: THis is what I am trying to get matched
      * match JSONtobeValidiated == ValidJsonSchema

我想验证 ValidJsonSchema 但无法绕过完整的 Schema 匹配

当我尝试匹配可选字段匹配时,我不断收到错误

com.intuit.karate.exception.KarateException: 期望找到一个 路径 $ 中具有属性 ['MyArray'] 的对象,但已找到 'net.minidev.json.JSONArray'。这不是一个 json 对象,根据 JsonProvider: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'。

我如何获得关注工作

  * match JSONtobeValidiated == ValidJsonSchema

【问题讨论】:

    标签: json karate


    【解决方案1】:

    感谢您的详细信息!我同意复杂的嵌套数组等似乎存在一些问题。我得到了以下工作,因为您可以看到空数组上的 textfield 匹配需要一些工作。你能帮我一个忙并简化一下,以便空手道处理中的任何差距都清楚 - 请记录一个问题。

    Scenario:
        * def json =
    """
        [
             {
                "SomeField":"dc",
                "textfield":[
    
                ],
                "OptionalArray1":[
                   {
                      "Users":"Y",
                      "IsAllowed":"Y"
                   },
                   {
                      "Users":"Y",
                      "IsAllowed":"Y"
                   }
                ]
             },
             {
                "SomeField":"nb",
                "textfield":[
    
                ],
                "OptionalArray2":[
                   {
                      "CodingP":"GZ",
                      "Name":"Ok"
                   },
                   {
                      "CodingP":"BO",
                      "Name":"Saved"
                   },
                   {
                      "CodingP":"YB",
                      "Name":"Done"
                   }
                ]
             },
             {
                "SomeField":"TRY",
                "textfield":[
    
                ]
             },
             {
                "SomeField":"cd",
                "textfield":[
    
                ],
                "OptionalArray3":[
                   {
                      "Astring":"Lazy",
                      "AnotherString":"N",
                      "textfield":[
    
                      ]
                   },
                   {
                      "Astring":"FREE",
                      "AnotherString":"N",
                      "textfield":[
                         {
                            "title":"Name",
                            "alertMessage":"Please enter valid name."
                         },
                         {
                            "title":"Mobile No",
                            "alertMessage":"Please enter mobile no."
                         }
                      ]
                   }
                ]
             },
             {
                "SomeField":"gv",
                "textfield":[
                   {
                      "title":"First",
                      "alertMessage":"SOme Alert"
                   }
                ]
             },
             {
                "SomeField":"OTP",
                "textfield":[
                   {
                      "title":"Second",
                      "alertMessage":"SOme other elert."
                   }
                ]
             },
             {
                "SomeField":"rp",
                "textfield":[
    
                ],
                "OptionalArray4":[
                   {
                      "Code":"ACODE",
                      "textfield":[
    
                      ]
                   }
                ]
             }
          ]
    """
    
    * def textfield = { title: '#string', alertMessage: '#string' }
    * def OptionalArray1 = { Users: '#string',IsAllowed: '#string' }
    * def OptionalArray2 = { CodingP: '#string',Name: '#string'}
    * def OptionalArray3 = { Astring: '#string' ,AnotherString: '#string', textfield: '##[]'  }
    * def OptionalArray4 = { Code: '#string',textfield: '##[]' }
    
    * def MYinternalDetails =
        """
          {
            SomeField: '#string',
            textfield: '##[] textfield',
            OptionalArray1: '##[] OptionalArray1',
            OptionalArray2: '##[] OptionalArray2',
            OptionalArray3: '##[] OptionalArray3',
            OptionalArray4: '##[] OptionalArray4',
    
          }
        """
    * match json == '#[] MYinternalDetails'
    

    【讨论】:

    • 感谢您的回复@Peter,我可以看到您的修改确实有效。我试图做的匹配似乎仍然存在一些问题。我将在 Github 上简化并记录问题。
    • @AmitVyas 感谢提出此问题,已修复在 GitHub 上:github.com/intuit/karate/issues/346
    猜你喜欢
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 2014-06-19
    相关资源
    最近更新 更多