JSONPath查找不包含字符串的节点

问题描述

我正在使用交通灯光谱创建用于倾斜Openapi文档的规则,光谱使用JSONPath plus。我一直在使用http://jsonpath.com/测试我的JSONPath。我试图在本文档中找到URL路径中没有单词pet的URL。 获取所有路径

$.paths[?(@property.match('.*$'))]~

结果

[
  "/pet","/pet/findByStatus","/pet/findByTags","/pet/{petId}","/pet/{petId}/uploadImage","/store/inventory","/store/order","/store/order/{orderId}","/user","/user/createWithArray","/user/createWithList","/user/login","/user/logout","/user/{username}"
]

要查找确实包含pet内容,请使用

$.paths[?(@property.match('.*pet.*$'))]~  

结果

[
  "/pet","/pet/{petId}/uploadImage"
]

但是我找不到返回不包含单词pet的任何路径的查询。我需要它从光谱规则中排除某些路径。任何建议将不胜感激。

这是我的测试JSON文档。

{
  "swagger": "2.0","info": {
    "description": "This is a sample server Petstore server.  You can find out more about     Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,#swagger](http://swagger.io/irc/).      For this sample,you can use the api key `special-key` to test the authorization     filters.","version": "1.0.0","title": "Swagger Petstore","termsOfService": "http://swagger.io/terms/","contact": {
      "email": "[email protected]"
    },"license": {
      "name": "Apache 2.0","url": "http://www.apache.org/licenses/LICENSE-2.0.html"
    }
  },"host": "petstore.swagger.io","basePath": "/v2","tags": [
    {
      "name": "pet","description": "Everything about your Pets","externalDocs": {
        "description": "Find out more","url": "http://swagger.io"
      }
    },{
      "name": "store","description": "Access to Petstore orders"
    },{
      "name": "user","description": "Operations about user","externalDocs": {
        "description": "Find out more about our store","url": "http://swagger.io"
      }
    }
  ],"schemes": [
    "https","http"
  ],"paths": {
    "/pet": {
      "post": {
        "tags": [
          "pet"
        ],"summary": "Add a new pet to the store","description": "","operationId": "addPet","consumes": [
          "application/json","application/xml"
        ],"produces": [
          "application/xml","application/json"
        ],"parameters": [
          {
            "in": "body","name": "body","description": "Pet object that needs to be added to the store","required": true,"schema": {
              "$ref": "#/deFinitions/Pet"
            }
          }
        ],"responses": {
          "405": {
            "description": "Invalid input"
          }
        },"security": [
          {
            "petstore_auth": [
              "write:pets","read:pets"
            ]
          }
        ]
      },"put": {
        "tags": [
          "pet"
        ],"summary": "Update an existing pet","operationId": "updatePet","responses": {
          "400": {
            "description": "Invalid ID supplied"
          },"404": {
            "description": "Pet not found"
          },"405": {
            "description": "Validation exception"
          }
        },"read:pets"
            ]
          }
        ]
      }
    },"/pet/findByStatus": {
      "get": {
        "tags": [
          "pet"
        ],"summary": "Finds Pets by status","description": "Multiple status values can be provided with comma separated strings","operationId": "findPetsByStatus","parameters": [
          {
            "name": "status","in": "query","description": "Status values that need to be considered for filter","type": "array","items": {
              "type": "string","enum": [
                "available","pending","sold"
              ],"default": "available"
            },"collectionFormat": "multi"
          }
        ],"responses": {
          "200": {
            "description": "successful operation","schema": {
              "type": "array","items": {
                "$ref": "#/deFinitions/Pet"
              }
            }
          },"400": {
            "description": "Invalid status value"
          }
        },"/pet/findByTags": {
      "get": {
        "tags": [
          "pet"
        ],"summary": "Finds Pets by tags","description": "Muliple tags can be provided with comma separated strings. Use         tag1,tag2,tag3 for testing.","operationId": "findPetsByTags","parameters": [
          {
            "name": "tags","description": "Tags to filter by","items": {
              "type": "string"
            },"400": {
            "description": "Invalid tag value"
          }
        },"read:pets"
            ]
          }
        ],"deprecated": true
      }
    },"/pet/{petId}": {
      "get": {
        "tags": [
          "pet"
        ],"summary": "Find pet by ID","description": "Returns a single pet","operationId": "getPetById","parameters": [
          {
            "name": "petId","in": "path","description": "ID of pet to return","type": "integer","format": "int64"
          }
        ],"schema": {
              "$ref": "#/deFinitions/Pet"
            }
          },"400": {
            "description": "Invalid ID supplied"
          },"404": {
            "description": "Pet not found"
          }
        },"security": [
          {
            "api_key": []
          }
        ]
      },"post": {
        "tags": [
          "pet"
        ],"summary": "Updates a pet in the store with form data","operationId": "updatePetWithForm","consumes": [
          "application/x-www-form-urlencoded"
        ],"description": "ID of pet that needs to be updated","format": "int64"
          },{
            "name": "name","in": "formData","description": "Updated name of the pet","required": false,"type": "string"
          },{
            "name": "status","description": "Updated status of the pet","type": "string"
          }
        ],"delete": {
        "tags": [
          "pet"
        ],"summary": "Deletes a pet","operationId": "deletePet","parameters": [
          {
            "name": "api_key","in": "header",{
            "name": "petId","description": "Pet id to delete","/pet/{petId}/uploadImage": {
      "post": {
        "tags": [
          "pet"
        ],"summary": "uploads an image","operationId": "uploadFile","consumes": [
          "multipart/form-data"
        ],"produces": [
          "application/json"
        ],"description": "ID of pet to update",{
            "name": "additionalMetadata","description": "Additional data to pass to server",{
            "name": "file","description": "file to upload","type": "file"
          }
        ],"schema": {
              "$ref": "#/deFinitions/ApiResponse"
            }
          }
        },"/store/inventory": {
      "get": {
        "tags": [
          "store"
        ],"summary": "Returns pet inventories by status","description": "Returns a map of status codes to quantities","operationId": "getInventory","parameters": [],"schema": {
              "type": "object","additionalProperties": {
                "type": "integer","format": "int32"
              }
            }
          }
        },"security": [
          {
            "api_key": []
          }
        ]
      }
    },"/store/order": {
      "post": {
        "tags": [
          "store"
        ],"summary": "Place an order for a pet","operationId": "placeOrder","description": "order placed for purchasing the pet","schema": {
              "$ref": "#/deFinitions/Order"
            }
          }
        ],"schema": {
              "$ref": "#/deFinitions/Order"
            }
          },"400": {
            "description": "Invalid Order"
          }
        }
      }
    },"/store/order/{orderId}": {
      "get": {
        "tags": [
          "store"
        ],"summary": "Find purchase order by ID","description": "For valid response try integer IDs with value >= 1 and <= 10.         Other values will generated exceptions","operationId": "getorderById","parameters": [
          {
            "name": "orderId","description": "ID of pet that needs to be fetched","maximum": 10,"minimum": 1,"404": {
            "description": "Order not found"
          }
        }
      },"delete": {
        "tags": [
          "store"
        ],"summary": "Delete purchase order by ID","description": "For valid response try integer IDs with positive integer value.         Negative or non-integer values will generate API errors","operationId": "deleteOrder","description": "ID of the order that needs to be deleted","404": {
            "description": "Order not found"
          }
        }
      }
    },"/user": {
      "post": {
        "tags": [
          "user"
        ],"summary": "Create user","description": "This can only be done by the logged in user.","operationId": "createuser","description": "Created user object","schema": {
              "$ref": "#/deFinitions/User"
            }
          }
        ],"responses": {
          "default": {
            "description": "successful operation"
          }
        }
      }
    },"/user/createWithArray": {
      "post": {
        "tags": [
          "user"
        ],"summary": "Creates list of users with given input array","operationId": "createusersWithArrayInput","description": "List of user object","items": {
                "$ref": "#/deFinitions/User"
              }
            }
          }
        ],"/user/createWithList": {
      "post": {
        "tags": [
          "user"
        ],"operationId": "createusersWithListInput","/user/login": {
      "get": {
        "tags": [
          "user"
        ],"summary": "Logs user into the system","operationId": "loginUser","parameters": [
          {
            "name": "username","description": "The user name for login",{
            "name": "password","description": "The password for login in clear text","schema": {
              "type": "string"
            },"headers": {
              "X-Rate-Limit": {
                "type": "integer","format": "int32","description": "calls per hour allowed by the user"
              },"X-Expires-After": {
                "type": "string","format": "date-time","description": "date in UTC when token expires"
              }
            }
          },"400": {
            "description": "Invalid username/password supplied"
          }
        }
      }
    },"/user/logout": {
      "get": {
        "tags": [
          "user"
        ],"summary": "Logs out current logged in user session","operationId": "logoutUser","/user/{username}": {
      "get": {
        "tags": [
          "user"
        ],"summary": "Get user by user name","operationId": "getUserByName","description": "The name that needs to be fetched. Use user1 for testing. ","schema": {
              "$ref": "#/deFinitions/User"
            }
          },"400": {
            "description": "Invalid username supplied"
          },"404": {
            "description": "User not found"
          }
        }
      },"put": {
        "tags": [
          "user"
        ],"summary": "Updated user","operationId": "updateUser","description": "name that need to be updated",{
            "in": "body","description": "Updated user object","responses": {
          "400": {
            "description": "Invalid user supplied"
          },"delete": {
        "tags": [
          "user"
        ],"summary": "Delete user","operationId": "deleteUser","description": "The name that needs to be deleted","responses": {
          "400": {
            "description": "Invalid username supplied"
          },"404": {
            "description": "User not found"
          }
        }
      }
    }
  },"securityDeFinitions": {
    "petstore_auth": {
      "type": "oauth2","authorizationUrl": "http://petstore.swagger.io/oauth/dialog","flow": "implicit","scopes": {
        "write:pets": "modify pets in your account","read:pets": "read your pets"
      }
    },"api_key": {
      "type": "apiKey","name": "api_key","in": "header"
    }
  },"deFinitions": {
    "Order": {
      "type": "object","properties": {
        "id": {
          "type": "integer","format": "int64"
        },"petId": {
          "type": "integer","quantity": {
          "type": "integer","format": "int32"
        },"shipDate": {
          "type": "string","format": "date-time"
        },"status": {
          "type": "string","description": "Order Status","enum": [
            "placed","approved","delivered"
          ]
        },"complete": {
          "type": "boolean","default": false
        }
      },"xml": {
        "name": "Order"
      }
    },"Category": {
      "type": "object","name": {
          "type": "string"
        }
      },"xml": {
        "name": "Category"
      }
    },"User": {
      "type": "object","username": {
          "type": "string"
        },"firstName": {
          "type": "string"
        },"lastName": {
          "type": "string"
        },"email": {
          "type": "string"
        },"password": {
          "type": "string"
        },"phone": {
          "type": "string"
        },"userStatus": {
          "type": "integer","description": "User Status"
        }
      },"xml": {
        "name": "User"
      }
    },"Tag": {
      "type": "object","xml": {
        "name": "Tag"
      }
    },"Pet": {
      "type": "object","required": [
        "name","photoUrls"
      ],"category": {
          "$ref": "#/deFinitions/Category"
        },"name": {
          "type": "string","example": "doggie"
        },"photoUrls": {
          "type": "array","xml": {
            "name": "photoUrl","wrapped": true
          },"items": {
            "type": "string"
          }
        },"tags": {
          "type": "array","xml": {
            "name": "tag","items": {
            "$ref": "#/deFinitions/Tag"
          }
        },"description": "pet status in the store","enum": [
            "available","sold"
          ]
        }
      },"xml": {
        "name": "Pet"
      }
    },"ApiResponse": {
      "type": "object","properties": {
        "code": {
          "type": "integer","type": {
          "type": "string"
        },"message": {
          "type": "string"
        }
      }
    }
  },"externalDocs": {
    "description": "Find out more about Swagger","url": "http://swagger.io"
  }
} 

解决方法

尝试一下: https://regex101.com/r/UNQPUI/1

此正则表达式将识别那些没有宠物的人。从这篇文章中获得了灵感: Regular expression to match a line that doesn't contain a word

测试字符串:

"/pet","/pet/findByStatus","/pet/findByTags","/pet/{petId}","/pet/{petId}/uploadImage","/store/inventory","/store/order","/store/order/{orderId}","/user","/user/createWithArray","/user/createWithList","/user/login","/user/logout","/user/{username}"

表达:

^((?!pet).)*$

编辑: 这可能更优雅,但尚未经过全面测试: https://regex101.com/r/abezBE/1

请让我知道这些表情中的任何一种是否对您有所帮助。