JSON의 패턴을 기반으로 찾기 및 바꾸기

JSON의 패턴을 기반으로 찾기 및 바꾸기

URL을 기반으로 uri다음과 같은 것을 찾아 Test123.elb.us-east-1.amazonaws.com에서 로 변경 해야 합니다.connectionIdhkl876xed763

예: 에서 까지 찾아 Test999.elb.us-east-1.amazonaws.com업데이트connectionIdhkl876klm812

파일의 샘플 내용입니다.

   "x-amazon-apigateway-integration": {
      "uri": "http://Test123.elb.us-east-1.amazonaws.com:8765/emote",
      "responses": {
        "200": {
          "statusCode": "200",
          ......
          ......

      "connectionType": "VPC_LINK",
      "connectionId": "hkl876",
      "httpMethod": "POST",
      "type": "http"
    }
  },
    "x-amazon-apigateway-integration": {
      "uri": "http://Test999.elb.us-east-1.amazonaws.com:4567/authcode/v1/remote",
      "responses": {
        "200": {
          "statusCode": "200",
          ......
          ......

      "connectionType": "VPC_LINK",
      "connectionId": "hkl876",
      "httpMethod": "PUT",
      "type": "http"
    }

제안해 주셔서 감사합니다.

전체 json 파일에서 이 솔루션을 시도하면 다음 오류 메시지가 나타납니다.

Traceback (most recent call last):
  File "sample.py", line 16, in <module>
    if data[key]['uri'].find("test123.elb.us-east-1.amazonaws.com") > 0:
TypeError: string indices must be integers

이것은 하나의 레코드에 대한 완전한 Swagger 파일입니다.

{
  "swagger": "2.0",
  "info": {
    "version": "2019-02-19T19:13:11Z"
  },
  "host": "abc.com",
  "schemes": [
    "http"
  ],
  "paths": {
    "/code123": {
      "post": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "x-correlationid",
            "in": "header",
            "required": true,
            "type": "string"
          },
          {
            "name": "content-type",
            "in": "header",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Access-Control-Allow-Origin": {
                "type": "string"
              }
            }
          },
          "security": [
            {
              "RequestTokenAuthorizer": []
            },
            {
              "api_key": []
            }
          ],
          "x-amazon-apigateway-integration": {
            "uri": "http://test123.elb.us-east-1.amazonaws.com:2768/sample/code",
            "responses": {
              "200": {
                "statusCode": "200",
                "responseParameters": {
                  "method.response.header.Access-Control-Allow-Origin": "'*'"
                }
              },
              "requestParameters": {
                "integration.request.header.x-correlationid": "method.request.header.x-correlationid",
                "integration.request.header.x-brand": "method.request.header.x-brand"
              },
              "passthroughBehavior": "when_no_templates",
              "connectionType": "VPC_LINK",
              "connectionId": "xyz879",
              "httpMethod": "POST",
              "type": "http"
            }
          }
        }
      }
    }
  }
}

답변1

비슷한 것으로 이 작업을 수행하는 더 좋은 방법이 있을 수 있지만 jq저는 이 도구를 마스터한 적이 없습니다. 저는 이를 달성하기 위해 Python을 사용하겠습니다. 업데이트된 JSON 문서를 보면 다음과 같습니다.

{
  "swagger": "2.0",
  "info": {
    "version": "2019-02-19T19:13:11Z"
  },
  "host": "abc.com",
  "schemes": [
    "http"
  ],
  "paths": {
    "/code123": {
      "post": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "x-correlationid",
            "in": "header",
            "required": true,
            "type": "string"
          },
          {
            "name": "content-type",
            "in": "header",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Access-Control-Allow-Origin": {
                "type": "string"
              }
            }
          },
          "security": [
            {
              "RequestTokenAuthorizer": []
            },
            {
              "api_key": []
            }
          ],
          "x-amazon-apigateway-integration": {
            "uri": "http://test123.elb.us-east-1.amazonaws.com:2768/sample/code",
            "responses": {
              "200": {
                "statusCode": "200",
                "responseParameters": {
                  "method.response.header.Access-Control-Allow-Origin": "'*'"
                }
              },
              "requestParameters": {
                "integration.request.header.x-correlationid": "method.request.header.x-correlationid",
                "integration.request.header.x-brand": "method.request.header.x-brand"
              },
              "passthroughBehavior": "when_no_templates",
              "connectionType": "VPC_LINK",
              "connectionId": "xyz879",
              "httpMethod": "POST",
              "type": "http"
            }
          }
        }
      }
    }
  }
}

다음 Python 스크립트를 실행합니다(위 예에서 이름 지정 ex.json).

#!/usr/bin/env python3

import json

with open('ex.json') as json_file:
    data = json.load(json_file)

    for path in data['paths']:
        for method in data['paths'][path]:
                if data['paths'][path][method]['responses']['x-amazon-apigateway-integration']['uri'].find("test123.elb.us-east-1.amazonaws.com") > 0:
                    data['paths'][path][method]['responses']['x-amazon-apigateway-integration']['responses']['connectionId'] = 'xed763'

    print(json.dumps(data, indent=4))

connectionId첫 번째 항목의 필드가 변경된 다음 출력을 얻습니다 .

{
    "swagger": "2.0",
    "info": {
        "version": "2019-02-19T19:13:11Z"
    },
    "host": "abc.com",
    "schemes": [
        "http"
    ],
    "paths": {
        "/code123": {
            "post": {
                "produces": [
                    "application/json"
                ],
                "parameters": [
                    {
                        "name": "x-correlationid",
                        "in": "header",
                        "required": true,
                        "type": "string"
                    },
                    {
                        "name": "content-type",
                        "in": "header",
                        "required": true,
                        "type": "string"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "200 response",
                        "schema": {
                            "$ref": "#/definitions/Empty"
                        },
                        "headers": {
                            "Access-Control-Allow-Origin": {
                                "type": "string"
                            }
                        }
                    },
                    "security": [
                        {
                            "RequestTokenAuthorizer": []
                        },
                        {
                            "api_key": []
                        }
                    ],
                    "x-amazon-apigateway-integration": {
                        "uri": "http://test123.elb.us-east-1.amazonaws.com:2768/sample/code",
                        "responses": {
                            "200": {
                                "statusCode": "200",
                                "responseParameters": {
                                    "method.response.header.Access-Control-Allow-Origin": "'*'"
                                }
                            },
                            "requestParameters": {
                                "integration.request.header.x-correlationid": "method.request.header.x-correlationid",
                                "integration.request.header.x-brand": "method.request.header.x-brand"
                            },
                            "passthroughBehavior": "when_no_templates",
                            "connectionType": "VPC_LINK",
                            "connectionId": "xed763",
                            "httpMethod": "POST",
                            "type": "http"
                        }
                    }
                }
            }
        }
    }
}

파이썬 스크립트:

  1. 파일을 열고 ex.json열린 파일을 호출합니다.json_file
  2. JSON을 Python 사전으로 읽어 들입니다.data
  3. 문서의 경로를 반복합니다(예: /code123).
  4. 각 경로를 반복하는 방법(예: post)
  5. uri이 요소의 필드에 대상 문자열이 포함되어 있는지 확인합니다 . find()문자열이 없으면 -1을 반환합니다.
  6. uri주어진 at에 key찾고 있는 문자열이 포함되어 있으면 connectionId원하는 값으로 필드를 덮어 씁니다.
  7. 루프가 완료된 후 (수정될 수 있음) JSON을 표준 출력으로 인쇄합니다.

관련 정보