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

 

posted @ 2015-08-26 10:50  流浪的如影  阅读(2382)  评论(0编辑  收藏  举报