zoukankan      html  css  js  c++  java
  • python xpath方法解析json

    现在移动互联网飞速发展,在测试过程中通常需要进行HTTP接口测试,而大多数http请求返回的是json数据。

    然而python对josn数据的解析,就是对字典的解析,以下面这段json为例:

    {
        "ver": "6.8",
        "dcid": "477",
        "head": {
            "cid": "",
            "ctok": "",
            "cver": "1.0",
            "lang": "01",
            "sid": "1",
            "syscode": "09",
            "auth": "",
            "extension": []
        },
        "contentType": "json"
    }

    如果我们要获取sid中的数据,需要这样解析

    第一种:jsonstr['head']['sid']

    第二种:jsonstr.get('head').get('sid')

    写完后发现这种方法是不是太low,而且当json层级太深时,代码可视性极差,而且难于维护。

    json属于结构化数据,就像html一样,于是考虑到用xpath方法去解析。下面直接上代码:

    import json
    import xmltodict
    
    # 解析json字符串
    class jsonprase(object):
        def __init__(self, json_value):
            try:
                eval(json_value)
                self.json_value = json.loads(json_value)
            except Exception, e :
                raise ValueError('must be a json str value')
    
    
        def find_json_node_by_xpath(self, xpath):
            elem = self.json_value
            nodes = xpath.strip("/").split("/")
            for x in range(len(nodes)):
                try:
                    elem = elem.get(nodes[x])
                except AttributeError:
                    elem = [y.get(nodes[x]) for y in elem]
            return elem
    
        def datalength(self, xpath="/"):
            return len(self.find_json_node_by_xpath(xpath))
    
        @property
        def json_to_xml(self):
            try:
                root = {"root": self.json_value}
                xml = xmltodict.unparse(root, pretty=True)
            except ArithmeticError, e:
                pyapilog().error(e)
            return xml

    然后测试一把

    a ='''{
        "ver": "6.8",
        "dcid": "477",
        "head": {
            "cid": "",
            "ctok": "",
            "cver": "1.0",
            "lang": "01",
            "sid": "1",
            "syscode": "09",
            "auth": "",
            "extension": []
        },
        "contentType": "json"
    }'''
    print type(a)
    d = jsonprase(a).find_json_node_by_xpath('/head/sid')
    print d
  • 相关阅读:
    那些年坑爹的JS题目
    CSS(十三).高度如何铺满全屏
    JS模式和原型精解
    CSS(十二).transition的应用之CSS中心扩散
    一些值得记录的面试题
    随笔
    原生Ajax实现
    code和pre竟然有区别!!!!
    原生JS轮播-各种效果的极简实现(二)面向对象版本的实现和优化
    原生JS轮播-各种效果的极简实现
  • 原文地址:https://www.cnblogs.com/donjor/p/4759418.html
Copyright © 2011-2022 走看看