`
shaojiashuai123456
  • 浏览: 262722 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

json 接口对比 python

 
阅读更多
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import urllib
import traceback
import json
import logging
import types
import re
import csv

logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    datefmt='%a, %d %b %Y %H:%M:%S',
    filename='check.log',
    filemode='w+')

logger = logging.getLogger(__name__)

def load_url(url_ifn):
    list_url = []
    with open(url_ifn) as url_file:
        for line in url_file:
            line = unicode(line.strip(), "utf-8", "ignore")
            list_url.append(line)
    return list_url


def curl_url(url):
    content = u''  
    try:   
        status = urllib.urlopen(url)   
        if status.getcode() == 200:   
            content = status.read()   
            content = unicode(content.strip(), 'utf-8', 'ignore')   
        else:   
            logger.error('fetch error [%s]' % url)   
    except:   
        logger.error('fetch error %s' % traceback.format_exc())
    return content  


def check_dict(dict_old, dict_new, url, ofh):
    global global_check_res
    set_old = set(dict_old.keys())
    set_new = set(dict_new.keys())

    set_same = set_old & set_new
    set_only_old = set_old - set_same
    set_only_new = set_new - set_same
    ofh.write("only_old:[%s] only_new:[%s]\n same:[%s]" % (",".join(set_only_old), ",".join(set_only_new), ",".join(set_same)))
    global_check_res = False


def check_segmentlist(seg_old, seg_new, url, ofh, from_msg):
    global global_check_res
    str_old = '->'.join([item['busid'] for item in seg_old if 'busid' in item])
    str_new = '->'.join([item['busid'] for item in seg_new if 'busid' in item])
    if str_old != str_new:
        ofh.write("[%s] segment_list old:[%s] new[%s]\n" % (from_msg, str_old, str_new))
        global_check_res = False
        return False
    else:
        return True
        

def check_json(old_obj, new_obj, url, ofh, from_msg):
    global global_check_res
    if type(old_obj) != type(new_obj):
        global_check_res = False      
        return False
    obj_type = type(old_obj)
    if obj_type == types.DictType:
        set_delete = set(["code", "version", "timestamp"])
        for key in old_obj.keys():
            if key in set_delete:
                continue
            if key == "color":
                old_obj[key] = old_obj[key].lower()
                new_obj[key] = new_obj[key].lower()
            if key not in new_obj:
                ofh.write("[%s]\t[%s]new not exist\n" % (from_msg, key))
                global_check_res = False
                continue
            if key == "segmentlist":
                if not check_segmentlist(old_obj[key], new_obj[key], url, ofh, "%s->%s" % (from_msg, key)):
                    continue
            if check_json(old_obj[key], new_obj[key], url, ofh, "%s->%s" % (from_msg, key)):
                continue
            else:
                ofh.write("[%s]\t[%s]\n" % (from_msg, key))
                global_check_res = False
        for key in new_obj.keys():
            if key not in old_obj:
                ofh.write("[%s]\t[%s]old not exist\n" % (from_msg, key))
                global_check_res = False

    elif obj_type == types.ListType:
        if len(old_obj) != len(new_obj):
            ofh.write("[%s]\tarray len not equals old[%d] new[%d]\n" % (from_msg, len(old_obj), len(new_obj))) 
            global_check_res = False

        for i in range(min(len(old_obj), len(new_obj))):
            if check_json(old_obj[i], new_obj[i], url, ofh, "%s->at[%s]" % (from_msg, i)):
                continue
            else:
                ofh.write("[%s]\tarray at [%s] \n" % (from_msg, i))			
                global_check_res = False
    else:
        if old_obj == new_obj:
            return True
        else:
            try:
                ofh.write("[%s]\t old:[%s] new:[%s]\n" % (from_msg, str(old_obj).encode("utf-8"), str(new_obj).encode("utf-8")))			
                global_check_res = False
            except:
                ofh.write("[%s] value not equal\n" % (from_msg))
                global_check_res = False
            return False
    return True


def main(url_ifn, check_ofn, old_url_prefix, new_url_prefix):
    global global_check_res
    list_url = load_url(url_ifn)
    print "load url line %d" % len(list_url)

    list_real_url = []
    for url in list_url:
        pars = url.split("?")
        if len(pars) < 2:
            print "fail:[%s]" % url
            continue
        list_real_url.append(pars[1])
    print "load real url line %d" % len(list_real_url)
    
    check_ofh = open(check_ofn, "w+")
    success_count = 0
    total_count = 0
    for i in range(len(list_real_url)):
        try:
            if i%100 == 0:
                logger.error("curl len[%d]" % i)
            url = list_real_url[i]

            old_url = "%s%s" % (old_url_prefix, url)
            new_url = "%s%s" % (new_url_prefix, url)
            
            old_content = curl_url(old_url)
            new_content = curl_url(new_url)
            
            if not old_content or not new_content:
                logger.error("[%s][content is null]" % url)
                continue

            try:
                old_obj = json.loads(old_content)
            except:
                logger.error("[%s] error [json parse error]" % (old_url))
                continue

            try:
                new_obj = json.loads(new_content)
            except:
                logger.error("[%s] error [json parse error]" % (new_url))
                continue

            global_check_res = True
            total_count += 1

            check_ofh.write("%s\n" % old_url)
            check_ofh.write("%s\n" % new_url)
            check_json(old_obj, new_obj, url, check_ofh, "parent")

            if global_check_res:
                success_count += 1
                check_ofh.write("[%s]\t[success]\n" % url)
            else:
                writer.writerow([old_url])
        except:
            logger.error("[%s] error [%s]" % (url, traceback.format_exc()))
    check_ofh.write("---------------------------\n")
    check_ofh.write("total_count:%d\n" %  total_count)
    check_ofh.write("success_count:%s\n" % success_count)
    check_ofh.write("fail_count:%s\n" % (total_count - success_count))
    check_ofh.close()

global_check_res = True
if __name__ == '__main__':
    url_ifn = ""
    if len(sys.argv) <= 1:
        sys.exit(1)
    url_ifn = sys.argv[1]
    check_ofn = "./check_res.txt"
    csvfile = file('diff.csv', 'w')
    writer = csv.writer(csvfile, dialect='excel')

    old_url_prefix = "http://127.0.0.1:14669/busservice?"
    new_url_prefix = "http://127.0.0.1:14668/busservice?"
    main(url_ifn, check_ofn, old_url_prefix, new_url_prefix)

 

分享到:
评论

相关推荐

    新浪、网易、腾讯实时tick接口_python股票_股票接口_新浪股票_tick股票_股票接口.zip

    本文将深入探讨如何利用Python来对接新浪、网易、腾讯的实时tick接口,以便获取股票数据。Tick数据是指股票交易中最小的时间单位,包含了每笔交易的详细信息,如价格、数量、买卖方向等。这些接口对于进行高频交易、...

    python调用阿里云SDK接口实现域名解析记录更新以及修改

    Python调用阿里云SDK接口实现域名解析记录更新与修改是一个重要的任务,特别是在自动化运维和动态DNS配置中。本文将深入探讨这一主题,介绍如何利用Python和阿里云SDK来完成相关操作,以及涉及到的相关技术。 首先...

    Python Web接口开发与测试

    - 开发工具选择:对比PythonIDLE、Sublime Text 3、PyCharm、Atom等开发工具的特点。 - 错误处理:讲解Python程序常见的缩进错误、引包错误、编码错误,并提供错误分析技巧。 2. Django Web开发: - Django环境...

    Python web接口开发与测试

    1.1 Python版本选择:Python2.x与Python3.x的对比和选择,主要因为Python2.x已停止更新,推荐使用Python3.x。 1.2 Python安装:介绍在不同操作系统下Python环境的搭建,包括Windows系统下的安装以及多版本共存的...

    Python-Api签名验证样例

    在API(应用程序编程接口)开发中,为了确保数据的安全传输,通常会采用签名验证机制。本文将详细探讨Python中API签名验证的相关知识点,以"Python-Api签名验证样例"为例,结合`flask-apiSign-demo-master`这个...

    python百度人脸对比接口代码.zip

    7. **返回结果**:成功调用接口后,服务器会返回一个包含对比结果的JSON对象,可能包括相似度分数、人脸特征向量等信息。开发者需要解析这些数据并根据业务需求进行处理。 8. **安装与配置**:在使用`aip-face`前,...

    Revit模型转JSON数据测试数据(JSON数据)

    JSON文件可以作为接口,与其他软件或服务进行集成,比如进行可视化渲染、碰撞检测、性能分析或者Web应用程序的开发。 测试数据如“testXZ.json”、“test.json”和“testwall.json”可能包含不同的Revit模型组件的...

    Python-simdjson项目的Python绑定

    Python-simdjson适用于需要频繁解析大量JSON数据的应用,如数据分析、日志处理、Web服务接口等。在大数据处理、实时流分析等场景中,使用simdjson可以显著降低CPU负载,提高整体系统效率。 **总结** Python-...

    json-rpc协议C语言版

    在本文中,我们将深入探讨JSON-RPC协议的C语言实现,并对比其与Python的实现方式。 ### JSON-RPC简介 JSON-RPC允许客户端通过HTTP或其他传输协议向服务器发送请求,执行服务器上的方法并接收响应。它支持单个请求/...

    Python web接口开发与测试.pdf

    书中还对比了不同编程语言中的Interface概念,例如Java的Interface和Python中的Zope.interface。 最后,在第八章中,作者重点讲述了开发Web接口的知识。首先介绍了HTTP协议与JSON格式的基本知识,然后详细解释了Web...

    python经典图书打包下载

    Python的标准库是其强大的组成部分,包含了各种模块和包,涵盖网络通信、操作系统接口、文本处理、数据压缩等。例如,`urllib`用于网络请求,`os`和`sys`用于操作系统交互,`json`用于数据序列化。`[Python标准库...

    python中的simplejson模块

    `simplejson`库提供了一个高效的JSON编码和解码接口,符合ECMAScript (欧洲计算机协会制定的一套标准的脚本语言规范)标准。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时...

    Python使用百度api做人脸对比的方法

    4. 调用`match`接口对比人脸。 5. 解析返回的JSON结果,判断相似度,确定是否为同一个人。 在实际应用中,可以根据需求调整相似度阈值,或者处理更多图片进行批量对比。同时,还可以探索其他百度API提供的功能,如...

    电子-JSON文件读写.zip

    7. JSON与其他数据格式的对比:例如XML,虽然两者都可以用于数据交换,但JSON通常因其简洁性和高效性而更受青睐。 通过学习"电子-JSON文件读写.zip"中的内容,你可以掌握在电子技术编程中如何有效地处理JSON数据,...

    python3.x上post发送json数据

    在进行接口自动化测试或类似工作时,正确地发送和接收JSON数据对于确保数据的完整性和可读性至关重要。这也意味着在抓包分析时,我们可以看到与我们预期相匹配的JSON格式数据,而不是损坏的数据。 最后,示例中还...

    分析Ajax接口获取QS排名的Python爬虫及QS排名文档.zip

    在这个案例中,可能是通过分析网络请求,找到用于获取QS排名数据的Ajax接口URL,然后使用Python的requests库发送GET或POST请求,以JSON或者其他格式获取数据。 接下来,我们关注Python爬虫代码。Python提供了丰富的...

    Python-Responder一个熟悉的PythonHTTP服务框架

    **三、与 Flask 和 Django 的对比** 相比 Flask,Responder 更加专注于 API 开发,提供更现代的异步支持。而与 Django 相比,Responder 更轻量级,适合快速开发小到中型的 Web 应用。 **四、实际应用与案例** ...

    json_demo.zip

    - 在Python中,使用`json`模块进行JSON操作,如`json.loads()`解析JSON字符串,`json.dumps()`序列化对象为JSON字符串。 - 其他语言如Java、C#、PHP等也有相应的库支持JSON的解析和生成。 3. JSON数据解析与序列...

Global site tag (gtag.js) - Google Analytics