簡體   English   中英

如何在運行時使用python驗證兩個JSON API Response鍵值對匹配?

[英]How to Validate two JSON API Response key-value pair matches on runtime using python?

我正在嘗試驗證兩個API JSON響應鍵-值對是否具有相同的鍵值,如果JSON響應不匹配,則會引發錯誤。

例如:1. www.oldurl.com提供=>

   { "firstName":"alex", "age":31, "dob":"10-12-1988" }

2. www.newurl.com gives =>

   { "firstName":"**alx**", "**ag**":31, "dob":"10-12-1988" }

在這里,oldurl和newurl給出了相同的JSON響應,但是在newurl中,我們看到了鍵和值中的錯誤。

現在,我需要捕獲此錯誤,並向用戶顯示newurl.com中的密鑰名和年齡不匹配。

Python代碼:

import unittest
import requests, json,settings
from requests.auth import HTTPBasicAuth
from jsonschema import validate
class TestOne(unittest.TestCase):
    def setUp(self):

    def test_oldurl(self):
    resp=requests.get('www.oldurl.com',auth=HTTPBasicAuth(settings.USER_NAME,settings.PASSWORD))
    data = resp.text
    print (data)  #Prints json 

    def test_newurl(self):
    resp=requests.get('www.newurl.com',auth=HTTPBasicAuth(settings.USER_NAME,settings.PASSWORD))
    data = resp.text
    print (data)  #Prints json 

現在我得到了兩個JSON響應,如何驗證這兩個響應。 是否有任何Python庫可以驗證並顯示鍵和值中的任何錯誤。

注意:這兩個JSON響應應該相同,作為驗證的一部分,我這樣做是為了避免以后的響應中出現任何錯誤。

我還將模式僅用於一個JSON響應密鑰驗證。 用過的:

    def setUp(self):
    with open('Blueprint_schema.json', 'r') as f:
        self.schema = f.read()
        self.file = f
     validate(json.loads(data), json.loads(self.schema))
     self.assertNotEqual(data,'[]')

但這僅對一個JSON響應鍵有用。 因此,我需要在執行時比較兩個API的JSON響應,或者將其存儲在兩個文件中並打開並進行驗證。 我以為可以驗證這些文件,但是會進行更多的編碼,因此考慮通過在運行時本身進行驗證來減少代碼長度。

請提出您的想法。

# newurl_resp should also give back same key:value pairs as oldurl was giving

#load JSON Data into Dictionary 
import json
f = open("response_oldurl.json")
oldurl_resp= json.load(f)
f.close()
#type(oldurl_resp) --> <class dict>

oldurl_resp = { "firstName":"alex", "age":31, "dob":"10-12-1988" }
newurl_resp = { "firstName":"**alx**", "**ag**":31, "dob":"10-12-1988"}

方法1即時報告錯誤

def validate_resp(old_resp,new_resp):
    for old_k,old_v in oldurl_resp.items():

        try:
            if old_k in new_resp:
                new_val = new_resp[old_k]
            else:
                raise KeyError('newurl_response doesn\'t have key: '+old_k)

            try:
                if old_v != new_val:
                    raise ValueError('new value = '+str(new_val)+' doesn\'t match with orignal value = '+str(old_v)+' of key: '+str(old_k))

                    #raise ValueError('new value = {} doesn\'t match with orignal value = {} of key: {}'.format(new_val,old_v,old_k))

            except ValueError as v_err:
                print(v_err.args)

        except KeyError as k_err:
            print(k_err.args)


validate_resp(oldurl_resp,newurl_resp)

#("new value = **alx** doesn't match with orignal value = alex of key: firstName",)
#("newurl_response doesn't have key: age",)

方法2保存它們以備后用

items_with_value_err = []
missing_keys = []

def validate_resp(old_resp,new_resp):
    for old_k,old_v in oldurl_resp.items():
        if old_k in new_resp:
            if new_resp[old_k] != old_v:
                # key is same but new_resp contains different value
                items_with_value_err.append((old_k,old_v,new_resp[old_k]))
        else:
            missing_keys.append(old_k)

    if len(items_with_value_err) == 0 and len(missing_keys) == 0:
        return True
    else:
        return False

print(validate_resp(oldurl_resp, newurl_resp)) #prints False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM