Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
94 views
in Technique[技术] by (71.8m points)

python - How to compare two JSON documents and return what is changed?

How to compare two JSON documents (one with old values and one with updated values) and return what has changed or newly added to the new document.

For example

JSON document a (old document):

{
  "Category": {
    "0": "CAPTCHA",
    "1": "Client Auto-update",
    "2": "Connectivity Check",
    "3": "Device Metrics (for 1.0+ and 2.0+ WorkSpaces client applications)",
    "4": "Client Metrics (for 3.0+ WorkSpaces client applications)",
    "5": "Dynamic Messaging Service (for 3.0+ WorkSpaces client applications)",
    "6": "Directory Settings",
    "7": "Forrester Log Service",
    "8": "Health Check (DRP) Servers",
    "9": "Registration Dependency (for Web Access and Teradici PCoIP Zero Clients)",
    "10": "User Login Pages",
    "11": "WS Broker",
    "12": "WorkSpaces API Endpoints"
  },
  "Domain or IP address": {
    "0": "https://opfcaptcha-prod.s3.amazonaws.com/",
    "1": "https://d2td7dqidlhjx7.cloudfront.net/  In the AWS GovCloud (US-West) Region:  https://s3.amazonaws.com/workspaces-client-updates/prod/pdt/windows/WorkSpacesAppCast.xml",
    "2": "https://connectivity.amazonworkspaces.com/",
    "3": "https://device-metrics-us-2.amazon.com/",
    "4": "Domains:  https://skylight-client-ds.us-east-1.amazonaws.com https://skylight-client-ds.us-west-2.amazonaws.com  https://skylight-client-ds.ap-northeast-2.amazonaws.com  https://skylight-client-ds.ap-southeast-1.amazonaws.com  https://skylight-client-ds.ap-southeast-2.amazonaws.com  https://skylight-client-ds.ap-northeast-1.amazonaws.com  https://skylight-client-ds.ca-central-1.amazonaws.com  https://skylight-client-ds.eu-central-1.amazonaws.com  https://skylight-client-ds.eu-west-1.amazonaws.com https://skylight-client-ds.eu-west-2.amazonaws.com  https://skylight-client-ds.sa-east-1.amazonaws.com  In the AWS GovCloud (US-West) Region:  https://skylight-client-ds.us-gov-west-1.amazonaws.com",
    "5": "Domains:  https://ws-client-service.us-east-1.amazonaws.com  https://ws-client-service.us-west-2.amazonaws.com  https://ws-client-service.ap-northeast-2.amazonaws.com  https://ws-client-service.ap-southeast-1.amazonaws.com  https://ws-client-service.ap-southeast-2.amazonaws.com  https://ws-client-service.ap-northeast-1.amazonaws.com  https://ws-client-service.ca-central-1.amazonaws.com  https://ws-client-service.eu-central-1.amazonaws.com  https://ws-client-service.eu-west-1.amazonaws.com  https://ws-client-service.eu-west-2.amazonaws.com  https://ws-client-service.sa-east-1.amazonaws.com",
    "6": "Authentication from the client to the customer directory  before login to the WorkSpace:  https://d32i4gd7pg4909.cloudfront.net/prod/<region>/<directory  ID>  Connections from macOS clients:  https://d32i4gd7pg4909.cloudfront.net/  Customer directory settings:  https://d21ui22avrxoh6.cloudfront.net/prod/<region>/<directory  ID>  Login page graphics for customer directory level co-branding:  https://d1cbg795sa4g1u.cloudfront.net/prod/<region>/<directory  ID>  CSS file to style the login pages:  https://d3s98kk2h6f4oh.cloudfront.net/  https://dyqsoz7pkju4e.cloudfront.net/  JavaScript file for the login pages:  US East (N. Virginia) — https://d32i4gd7pg4909.cloudfront.net/  US West (Oregon) — https://d18af777lco7lp.cloudfront.net/  Asia Pacific (Seoul) — https://dtyv4uwoh7ynt.cloudfront.net/  Asia Pacific (Singapore) — https://d3qzmd7y07pz0i.cloudfront.net/  Asia Pacific (Sydney) — https://dwcpoxuuza83q.cloudfront.net/  Asia Pacific (Tokyo) — https://d2c2t8mxjhq5z1.cloudfront.net/  Canada (Central) — https://d2wfbsypmqjmog.cloudfront.net/  Europe (Frankfurt) — https://d1whcm49570jjw.cloudfront.net/  Europe (Ireland) — https://d3pgffbf39h4k4.cloudfront.net/  Europe (London) — https://d16q6638mh01s7.cloudfront.net/  South America (S?o Paulo) — https://d2lh2qc5bdoq4b.cloudfront.net/  In the AWS GovCloud (US-West) Region:  Customer directory settings:  https://s3.amazonaws.com/workspaces-client-properties/prod/pdt/<directory  ID>  Login page graphics for customer directory level co-branding:  https://s3.amazonaws.com/workspaces-client-assets/prod/pdt/<directory  ID>  CSS file to style the login pages:  https://s3.amazonaws.com/workspaces-clients-css/workspaces_v2.css  JavaScript file for the login pages:  Not applicable",
    "7": "https://fls-na.amazon.com/",
    "8": "Health Check Servers",
    "9": "https://s3.amazonaws.com",
    "10": "https://<directory id>.awsapps.com/ (where  <directory id> is the customer's domain)",
    "11": "Domains:  https://ws-broker-service.us-east-1.amazonaws.com  https://ws-broker-service-fips.us-east-1.amazonaws.com  https://ws-broker-service.us-west-2.amazonaws.com  https://ws-broker-service-fips.us-west-2.amazonaws.com  https://ws-broker-service.ap-northeast-2.amazonaws.com  https://ws-broker-service.ap-southeast-1.amazonaws.com  https://ws-broker-service.ap-southeast-2.amazonaws.com  https://ws-broker-service.ap-northeast-1.amazonaws.com  https://ws-broker-service.ca-central-1.amazonaws.com  https://ws-broker-service.eu-central-1.amazonaws.com  https://ws-broker-service.eu-west-1.amazonaws.com  https://ws-broker-service.eu-west-2.amazonaws.com  https://ws-broker-service.sa-east-1.amazonaws.com  https://ws-broker-service.us-gov-west-1.amazonaws.com  https://ws-broker-service-fips.us-gov-west-1.amazonaws.com",
    "12": "Domains:  https://workspaces.us-east-1.amazonaws.com  https://workspaces-fips.us-east-1.amazonaws.com  https://workspaces.us-west-2.amazonaws.com  https://workspaces-fips.us-west-2.amazonaws.com  https://workspaces.ap-northeast-2.amazonaws.com  https://workspaces.ap-southeast-1.amazonaws.com  https://workspaces.ap-southeast-2.amazonaws.com  https://workspaces.ap-northeast-1.amazonaws.com  https://workspaces.ca-central-1.amazonaws.com  https://workspaces.eu-central-1.amazonaws.com  https://workspaces.eu-west-1.amazonaws.com  https://workspaces.eu-west-2.amazonaws.com  https://workspaces.sa-east-1.amazonaws.com  https://workspaces.us-gov-west-1.amazonaws.com  https://workspaces-fips.us-gov-west-1.amazonaws.com"
  }
}

JSON document b (new document):

{
  "Category": {
    "0": "CAPTCHA",
    "1": "Client Auto-update",
    "2": "Connectivity Check",
    "3": "Device Metrics (for 1.0+ and 2.0+ WorkSpaces client applications)",
    "4": "Client Metrics (for 3.0+ WorkSpaces client applications)",
    "5": "Dynamic Messaging Service (for 3.0+ WorkSpaces client applications)",
    "6": "Directory Settings",
    "7": "Forrester Log Service",
    "8": "Health Check (DRP) Servers",
    "9": "Registration Dependency (for Web Access and Teradici PCoIP Zero Clients)",
    "10": "User Login Pages",
    "11": "WS Broker",
    "12": "WorkSpaces API Endpoints"
  },
  "Domain or IP address": {
    "0": "https://opfcaptcha-prod.s3.amazonaws.com/",
    "1": "https://d2td7dqidlhjx7.cloudfront.net/  In the AWS GovCloud (US-West) Region:  https://s3.amazonaws.com/workspaces-client-updates/prod/pdt/windows/WorkSpacesAppCast.xml",
    "2": "https://connectivity.amazonworkspaces.com/",
    "3": "https://device-metrics-us-2.amazon.com/",
    "4": "Domains:  https://skylight-client-ds.us-east-1.amazonaws.com https://skylight-client-ds.us-west-2.amazonaws.com  https://skylight-client-ds.ap-northeast-2.amazonaws.com  https://skylight-client-ds.ap-southeast-1.amazonaws.com  https://skylight-client-ds.ap-southeast-2.amazonaws.com  https://skylight-client-ds.ap-northeast-1.amazonaws.com  https://skylight-client-ds.ca-central-1.amazonaws.com  https://skylight-client-ds.eu-central-1.amazonaws.com  https://skylight-client-ds.eu-west-1.amazonaws.com https://skylight-client-ds.eu-west-2.amazonaws.com  https://skylight-client-ds.sa-east-1.amazonaws.com  In the AWS GovCloud (US-West) Region:  https://skylight-client-ds.us-gov-west-1.amazonaws.com",
    "5": "Domains:  https://ws-client-service.us-east-1.amazonaws.com  https://ws-client-service.us-west-2.amazonaws.com  https://ws-client-service.ap-northeast-2.amazonaws.com  https://ws-client-service.ap-southeast-1.amazonaws.com  https://ws-client-service.ap-southeast-2.amazonaws.com  https://ws-client-service.ap-northeast-1.amazonaws.com  https://ws-client-service.ca-central-1.amazonaws.com  https://ws-client-service.eu-central-1.amazonaws.com  https://ws-client-service.eu-west-1.amazonaws.com  https://ws-client-service.eu-west-2.amazonaws.com  https://ws-client-service.sa-east-1.amazonaws.com",
    "6": "Authentication from the client to the customer directory  before login to the WorkSpace:  https://d32i4gd7pg4909.cloudfront.net/prod/<region>/<directory  ID>  Connections from macOS clients:  https://d32i4gd7pg4909.cloudfront.net/  Customer directory settings:  https://d21ui22avrxoh6.cloudfront.net/prod/<region>/<directory  ID>  Login page graphics for customer directory level co-branding:  https://d1cbg795sa4g1u.cloudfront.net/prod/<region>/<directory  ID>  CSS file to style the login pages:  https://d3s98kk2h6f4oh.cloudfront.net/  https://dyqsoz7pkju4e.cloudfront.net/  JavaScript file for the login pages:  US East (N. Virginia) — https://d32i4gd7pg4909.cloudfront.net/  US West (Oregon) — https://d18af777lco7lp.cloudfront.net/  Asia Pacific (Seoul) — https://dtyv4uwoh7ynt.cloudfront.net/  Asia Pacific (Singapore) — https://d3qzmd7y07pz0i.cloudfront.net/  Asia Pacific (Sydney) — https://dwcpoxuuza83q.cloudfront.net/  Asia Pacific (Tokyo) — https://d2c2t8mxjhq5z1.cloudfront.net/  Canada (Central) — https://d2wfbsypmqjmog.cloudfront.net/  Europe (Frankfurt) — https://d1whcm49570jjw.cloudfront.net/  Europe (Ireland) — https://d3pgffbf39h4k4.cloudfront.net/  Europe (London) — https://d16q6638mh01s7.cloudfront.net/  South America (S?o Paulo) — https://d2lh2qc5bdoq4b.cloudfront.net/  In the AWS GovCloud (US-West) Region:  Customer directory settings:  https://s3.amazonaws.com/workspaces-client-properties/prod/pdt/<directory  ID>  Login page graphics for customer directory level co-branding:  https://s3.amazonaws.com/workspaces-client-assets/prod/pdt/<directory  ID>  CSS file to style the login pages:  https://s3.amazonaws.com/workspaces-clients-css/workspaces_v2.css  JavaScript file for the login pages:  Not applicable",
    "7": "https://fls-na.amazon.com/",
    "8": "Health Check Servers",
    "9": "https://s3.amazonaws.com",
    "10": "https://<directory id>.awsapps.com/ (where  <directory id> is the customer's domain)",
    "11": "Domains:  https://ws-broker-service.us-east-1.amazonaws.com  https://ws-broker-service-fips.us-east-1.amazonaws.com  https://ws-broker-service.us-west-2.amazonaws.com  https://ws-broker-service-fips.us-west-2.amazonaws.com  https://ws-broker-service.ap-northeast-2.amazonaws.com  https://ws-broker-service.ap-southeast-1.amazonaws.com  https:/

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Try this (general Idea):

def check_diff(get_old_document, get_new_document):
    old_categories, old_domains = get_old_document["Category"], get_old_document["Domain or IP address"]
    new_categories, new_domains = get_new_document["Category"], get_new_document["Domain or IP address"]

    result = []
    for each_key, each_value in new_categories.items():
        if each_key in old_categories and old_categories[each_key] == each_key:
            result.append("Updated Categories; Key: {}, Updated Value: {}".format(each_key, each_value))
        elif each_key not in old_categories:
            result.append("Added new Category; Key: {}, Value: {}".format(each_key, each_value))

    for each_key, each_value in new_domains.items():
        if each_key in old_categories and old_categories[each_key] == each_key:
            result.append("Updated Domains; Key: {}, Updated Value: {}".format(each_key, each_value))
        elif each_key not in old_categories:
            result.append("Added new Domain; Key: {}, Value: {}".format(each_key, each_value))
    
    for each_key, each_value in old_categories.items():
        if each_key not in new_categories:
            result.append("Removed from Categories; Key: {}, Value: {}".format(each_key, each_value))
    for each_key, each_value in old_domains.items():
        if each_key not in new_domains:
            result.append("Removed from Domains; Key: {}, Value: {}".format(each_key, each_value))
    return "
".join(result)


print(check_diff(your_old_json, your_new_json))

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...