问题描述
我正在使用交通灯光谱创建用于倾斜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
请让我知道这些表情中的任何一种是否对您有所帮助。