python json 解析

2023-05-16


# -*- coding: utf-8 -*-
import sys, os, re


class JsonBaseType:
    single_type = 0
    object_type = 1
    array_type = 2


class ParseException():
    def __init__(self,error):
        self.error = error

    def __str__(self,*args,**kwargs):
        return self.error

# NUMBER_RE = re.compile(
#     r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?',
#     (re.VERBOSE | re.MULTILINE | re.DOTALL))
class JsonHelper(object):
    def __init__(self):
        self.jsObjectType = JsonBaseType.single_type
        self.dictResult = dict()

        self.jsEleName = ''
        self.jsArrayValue = []

    def __getitem__(self, item):
        return self.dictResult[item]

    def JsonParse(self, jsString):
        jsString = jsString.strip()
        jsString = jsString.replace('\r', '').replace('\n', '')

        if len(jsString) > 0:
            if jsString[0] == '{':
                self.jsObjectType = JsonBaseType.object_type
                self.ObjectParse(jsString[1:])
            elif jsString[0] == '[':
                self.jsObjectType = JsonBaseType.array_type
                self.ArrayParse(jsString[1:])
            else:
                jsString, ret_object, ret_string = self.SingleObjectParse(jsString)
                self.dictResult[''] = ret_object
                if 0 != len(ret_string):
                    self.dictResult['String' + ret_string] = ret_string
        else:
            raise ParseException('JsonParse json error 2|||' + jsString)

        return self.dictResult

    def ArrayParse(self, jsString):
        nIdxRet = 0
        bEndObject = False
        bCorrectFormat = True
        nLenString = len(jsString)
        jsStringBak = ''

        bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 0)
        if not bCorrectFormat:
            raise ParseException('ArrayParse json error 1|||' + jsString[0:20])

        nPos = jsString.find('{')
        if -1 != nPos:
            jsString = jsString[nPos+1:]

        while True:
            nIdxTmp = len(jsString)
            jsString = jsString.strip()
            jsString = jsString[1:]
            nIdxRet += nIdxTmp - len(jsString) + 1#清除开头的空白字符,并更新当前位置
            jsObj = JsonHelper()
            nIdxTmp, bEndObject = jsObj.ObjectParse(jsString, True)#非子节点
            self.jsArrayValue.append(jsObj)
            nIdxRet += nIdxTmp
            jsString = jsString[len(jsString)-nIdxTmp:]#抛弃已解析完的,保留还未解析的

            if 0 == len(jsString):
                break

            if bEndObject:
                bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 5)
                if not bCorrectFormat:
                    raise ParseException('ArrayParse json error 1|||' + jsString[0:20])
                else:
                    if bEndObject:
                        break

                    nPos = jsString.find(',')#直接找下一个object
                    if -1 != nPos:
                        jsString = jsString[nPos:]
                        bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 6)  # 1、{到"之间不能有其他可见字符
                        if bCorrectFormat:
                            nPos = jsString.find('"')
                            if -1 != nPos:
                                jsString = jsString[nPos:]
                                jsString = jsString.strip()
                    else:
                        bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 7)
                        if not bCorrectFormat:
                            raise ParseException('ArrayParse json error 2|||' + jsString[0:20])
                        else:
                            if bEndObject:
                                nPos = jsString.find(']')
                                if -1 != nPos:
                                    jsString = jsString[nPos+1:]
                                    jsString = jsString.strip()
                                    break

        jsStringBak = jsString
        self.dictResult[self.jsEleName] = self.jsArrayValue
        self.jsArrayValue = []
        return len(jsStringBak), bEndObject

    def ArrayParseEx(self, jsString):
        jsString = jsString.strip()
        nIdxRet = 0
        bEndObject = False
        bCorrectFormat = True
        nLenString = len(jsString)
        jsStringBak = ''

        while True:
            if jsString[0] == '[':
                pass
            elif jsString[0] == '{':
                pass
            else:
                jsString, ret_object, ret_string = self.SingleObjectParse(jsString)
                self.jsArrayValue.append(ret_object)
                if 0 != len(ret_string):
                    self.dictResult['String'] = ret_string

            jsString = jsString.strip()
            if 0 == len(jsString):
                break




# 就代码======================================================

            if bEndObject:
                bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 5)
                if not bCorrectFormat:
                    raise ParseException('ArrayParse json error 1|||' + jsString[0:20])
                else:
                    if bEndObject:
                        break

                    nPos = jsString.find(',')  # 直接找下一个object
                    if -1 != nPos:
                        jsString = jsString[nPos:]
                        bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 6)  # 1、{到"之间不能有其他可见字符
                        if bCorrectFormat:
                            nPos = jsString.find('"')
                            if -1 != nPos:
                                jsString = jsString[nPos:]
                                jsString = jsString.strip()
                    else:
                        bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 7)
                        if not bCorrectFormat:
                            raise ParseException('ArrayParse json error 2|||' + jsString[0:20])
                        else:
                            if bEndObject:
                                nPos = jsString.find(']')
                                if -1 != nPos:
                                    jsString = jsString[nPos + 1:]
                                    jsString = jsString.strip()
                                    break

        jsStringBak = jsString
        self.dictResult[self.jsEleName] = self.jsArrayValue
        self.jsArrayValue = []
        return len(jsStringBak), bEndObject

    def ObjectParse(self, jsString, bChildObj = False, bArrayObj = False):
        nIdxRet = 0
        bEndObject = False
        nLenString = len(jsString)
        jsStringBak = ''

        while True:
            nIdxTmp = len(jsString)
            jsString = jsString.strip()
            if jsString[0] == '"':
                jsString = jsString[1:]
            jsStringBak = jsString
            nIdxTmp, bEndObject = self.ElementParse(jsString)

            if bEndObject:
                jsString = jsString[len(jsString) - nIdxTmp:]
                if bChildObj or bArrayObj:
                    break
            else:
                jsString = jsString[len(jsString)-nIdxTmp+1:]#抛弃已解析完的,保留还未解析的

            if 0 == len(jsString):
                break

        jsStringBak = jsString
        return len(jsStringBak), bEndObject

    def SingleObjectParse(self, jsString):
        ret_object = None
        ret_string = ''
        if jsString[0] == 'n' and jsString[0:4] == 'null':
            jsString = jsString[4:]
        elif jsString[0] == 't' and jsString[0:4] == 'true':
            ret_object = True
            jsString = jsString[4:]
        elif jsString[0] == 'f' and jsString[0:5] == 'false':
            ret_object = False
            jsString = jsString[5:]
        elif jsString[0] == '"':
            ret_value, tmp_pos, end_object = self.ElementStringParse(jsString[1:], False, True)
            ret_object = ret_value
            jsString = jsString[len(jsString) - tmp_pos + 1:]
        else:
            match_res = re.match(r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?', jsString, re.M | re.I)
            if match_res:
                try:
                    str_num = match_res.group()
                    try:
                        ret_object = int(str_num)
                    except ValueError:
                        ret_object = float(str_num)  # 指数可能会失败,如果精度要求太高的话
                        ret_string = str_num

                    idx_ret = jsString.find(str_num) + len(str_num)
                    jsString = jsString[idx_ret:]
                except ValueError:
                    raise ParseException('SingleObjectParse json error 1|||' + jsString)
            else:
                raise ParseException('SingleObjectParse json error 2|||' + jsString)

        # 校验普通值后面的数据,值后面还有数值格式就不对了
        jsString = jsString.strip()
        if 0 != len(jsString):
            raise ParseException('SingleObjectParse json error 3|||' + jsString)

        return jsString, ret_object, ret_string

    #进到ElementParse已经是去掉当前Element的第一个"(ps  userId": "U46554751"...)
    def ElementParse(self, jsString):
        chNext = ''
        bEndObject = False  # 当前object是否结束
        nLenString = len(jsString)
        nIdxTmp = 0

        nIdxRet = len(jsString)
        jsString = jsString.strip()
        nIdxRet = nIdxRet - len(jsString)
        self.jsEleName, nIdxTmp, bEndObject = self.ElementStringParse(jsString)# 获得元素名
        jsString = jsString[nLenString - nIdxTmp + 1:]#把前面已解析完蛋抛弃掉
        jsStringBak = jsString
        nIdxTmp = len(jsString)
        jsString = jsString.strip()#移除开头空白字符
        nIdxRet += nIdxTmp - len(jsString)
        nIdxTmp = 0

        bCorrectFormat = True#默认是符合空白字符规则的
        if jsString[0:4] == 'true' or jsString[0:4] == 'null' or jsString[0:5] == 'false':
            bCorrectFormat = True
        else:
            matchRes = re.match(r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?', jsString, re.M | re.I)
            if not matchRes:
                bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 2)
                if not bCorrectFormat:#element name取出来后马上检查:到值之间是否有违规字符
                    raise ParseException('ElementParse json error 1|||' + jsString[0:20])

        bNtf = False #是否是null,true,false三种之一,这时候需要校验当前object是否结束,是否符合空白规则
        for idx in range(len(jsString)):
            try:
                chNext = jsString[idx]
            except IndexError:
                raise ParseException('ElementParse visit overstep the boundary 1|||' + jsString[idx:idx+20])

            if bNtf:  # null,true,false以及数值型数据这几种类型值取出来后马上检查结尾是否有违规字符(非空白),结尾可能是,也可能是}
                bCorrectFormat, bEndObject = self.CheckBlankByte(jsString[nIdxTmp:], 4)
                if not bCorrectFormat:
                    raise ParseException('ElementParse json error 2|||' + jsString[nIdxTmp:nIdxTmp+20])

                if bEndObject:#解析到这里,说明当前的element已经结完,接下去不是空白字符就是,或者}
                    nIdxRet = jsString.find('}') + 1
                else:
                    nIdxRet = jsString.find(',') + 1
                jsStringBak = jsString[nIdxRet:]

                nIdxTmp = 0
                break

            if chNext == 'n' and jsString[idx:idx + 4] == 'null':
                bNtf = True
                nIdxTmp = idx + 4
                nIdxRet = nIdxRet + 4
                jsStringBak = jsStringBak[nIdxRet:]
                self.dictResult[self.jsEleName] = None
                continue
            elif chNext == 't' and jsString[idx:idx + 4] == 'true':
                bNtf = True
                nIdxTmp = idx + 4
                nIdxRet = nIdxRet + 4
                jsStringBak = jsStringBak[nIdxRet:]
                self.dictResult[self.jsEleName] = True
                continue
            elif chNext == 'f' and jsString[idx:idx + 5] == 'false':
                bNtf = True
                nIdxTmp = idx + 5
                nIdxRet = nIdxRet + 5
                jsStringBak = jsStringBak[nIdxRet:]
                self.dictResult[self.jsEleName] = False
                continue
            elif chNext == '"':#字符串
                jsStringValue, nIdxTmp, bEndObject = self.ElementStringParse(jsString[1:], True)
                jsString = jsString[len(jsString)-nIdxTmp+1:]
                jsStringBak = jsString
                nIdxRet = nIdxRet + nIdxTmp + 1
                self.dictResult[self.jsEleName] = jsStringValue
                nIdxTmp = 0
                break
            elif chNext == '[':
                if jsString[0] == '[':
                    jsString = jsString[1:]
                if 0 != len(self.jsArrayValue):
                    self.jsArrayValue = []
                nIdxTmp, bEndObject = self.ArrayParse(jsString)
                jsString = jsString[len(jsString) - nIdxTmp + 1:]
                jsStringBak = jsString
                nIdxRet += nIdxTmp
                nIdxTmp = 0
                break
            elif chNext == '{':
                jsObjectValue = JsonHelper()
                strRes = jsString[idx+1:]#从{的下一个位置开始解析接下来的object
                strRes = strRes.strip()
                nIdxTmp, bEndObject = jsObjectValue.ObjectParse(strRes, True)
                self.dictResult[self.jsEleName] = jsObjectValue
                if bEndObject:
                    jsString = strRes[len(strRes) - nIdxTmp:]
                else:
                    jsString = strRes[len(strRes) - nIdxTmp + 1:]
                jsStringBak = jsString
                if bEndObject:
                    bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 4)#判断是否还有下一个element,并校验格式
                    if not bCorrectFormat:
                        raise ParseException('ElementParse json error 3|||' + jsString[0:20])
                    else:
                        if not bEndObject:
                            nIdxTmp = jsString.find(',')
                            if -1 != nIdxTmp:
                                jsString = jsString[nIdxTmp+1:]
                                nIdxRet = nIdxRet + nIdxTmp + 1
                                jsStringBak = jsString
                            bCorrectFormat, bEndObject = self.CheckBlankByte(jsString, 3)#还有下一个element,校验,到"之间的格式
                            if not bCorrectFormat:
                                raise ParseException('ElementParse json error 4|||' + jsString[0:20])
                            else:
                                nIdxTmp = jsString.find('"')
                                if -1 != nIdxTmp:
                                    jsString = jsString[nIdxTmp:]
                                    nIdxRet = nLenString - len(jsString)
                                    jsStringBak = jsString
                        else:
                            nIdxTmp = jsString.find('}')
                            if -1 != nIdxTmp:
                                jsString = jsString[nIdxTmp + 1:]
                                jsStringBak = jsString
                nIdxTmp = 0
                break
            else:
                #其他情况解析为数据,如果无法解析,则json格式错了
                strNum = jsString.strip()
                matchRes = re.match(r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?', strNum, re.M | re.I)
                if matchRes:
                    bNtf = True
                    try:
                        strNum = matchRes.group()
                        try:
                            self.dictResult[self.jsEleName] = int(strNum)
                        except ValueError:
                            self.dictResult[self.jsEleName] = float(strNum)#指数可能会失败,如果精度要求太高的话
                            self.dictResult[self.jsEleName+'String'] = strNum

                        nIdxRet = nIdxRet + jsString.find(strNum) + len(strNum)
                        nIdxTmp = len(strNum)
                        jsStringBak = jsString[nIdxRet:]
                    except ValueError:
                        raise ParseException('ElementParse json error 5|||' + jsString[0:20])
                else:
                    raise ParseException('ElementParse json error 6|||' + jsString[0:20])

        return len(jsStringBak), bEndObject

    # 类型名失败测试
    # 'us%"e\\"r\\\\%c Pho\'n:e": \"13030\"rc Pho\'n:303131\"'
    # 类型名成功用力
    # 'us%e\\"r\\\\%c Pho\'n:e": \"13030\"rc Pho\'n:303131\"'
    # ‘userName": "张三李四王麻子",’

    # 值失败测试
    # '13030\"rc Pho\'n:303131"sdf,'
    # '张三李四王麻子" qw}'
    # 值成功测试
    # '13030\"rc Pho\'n:303131",'
    # ‘张三李四王麻子"}’
    def ElementStringParse(self, jsString, bVal = False, bNormalString = False):
        nRet = 0#返回解析完成之后开始继续遍历字符串的位置
        strRet = ''#返回字符串值
        ch = ''#临时字符
        bEnd = False#字符串是否结束了
        bEndObject = False#当前object是否结束
        nLenString = len(jsString)
        for n in range(nLenString):
            try:
                ch = jsString[n]
            except ValueError:
                raise ParseException('ElementStringParse visit overstep the boundary 1|||' + jsString[n:n+20])

            nRet = n + 1

            if not bEnd:
                if ch == '\\':
                    chNext = ''
                    chPre = ''
                    try:
                         chNext = jsString[n+1]
                         if n > 0:
                             chPre = jsString[n-1]
                    except ValueError:
                        raise ParseException('ElementStringParse visit overstep the boundary 2|||' + jsString[n:n+20])

                    if chNext != '"' and chNext != '\\' and chPre != '\\':
                        raise ParseException('ElementStringParse json error 1|||' + jsString[n:n+20])
                    strRet = strRet + ch
                else:
                    if ch == '"':
                        if not (n > 0 and jsString[n-1] == '\\'):
                            bEnd = True  # 找到结束”
                            if bNormalString:
                                break
                            continue
                    strRet = strRet + ch
            else:
                if not bVal:
                    if ch != ' ' and ch != '\t' and ch != ':': # "到:之间有其他字符
                        raise ParseException('ElementStringParse json error 2|||' + jsString[n:n+20])
                    else:
                        if ch == ':':  # //字段名结尾是:
                            break
                else:
                    if ch != ' ' and ch != '\t' and ch != ',' and ch != '}':  # "到,或者}之间有其他字符
                        raise ParseException('ElementStringParse json error 3|||' + jsString[n:n+20])
                    else:
                        if ch == ',' or ch == '}':  # 值结尾可能是,也可能是}
                            if ch == '}':
                                bEndObject = True
                            break
        return strRet, nLenString-nRet+1, bEndObject

    # 校验空白字符是否正确
    def CheckBlankByte(self, jsString, nCheckPos):

        if 0 == jsString.find('666'):
            jsString = jsString

        chTmp = ''
        bEndObject = False
        bCorrectFormat = True
        for n in range(len(jsString)):
            chTmp = jsString[n]
            if nCheckPos == 0:#[到{之间
                if chTmp != '{' and chTmp != ' ' and chTmp != '\t':
                    bCorrectFormat = False
                    break
                if chTmp == '{':
                    break
            elif nCheckPos == 1 or nCheckPos == 3:#1、{到"之间 3、,到“之间
                if chTmp != '"' and chTmp != ' ' and chTmp != '\t':
                    bCorrectFormat = False
                    break
                if chTmp == '"':
                    break
            elif nCheckPos == 2:#:到数值之间,可能是"也可能是{
                if chTmp != '[' and chTmp != '{' and chTmp != '"' and chTmp != ' ' and chTmp != '\t':
                    bCorrectFormat = False
                    break
                if chTmp == '[' or chTmp == '{' or chTmp == '"':
                    break
            elif nCheckPos == 4:#子object结束,可能是,也可能是}
                if chTmp != ',' and chTmp != '}' and chTmp != ' ' and chTmp != '\t':
                    bCorrectFormat = False
                    break
                if chTmp == ',' or chTmp == '}':
                    if chTmp == '}':
                        bEndObject = True
                    break
            elif nCheckPos == 5:#array节点结束,可能是,也可能是]
                if chTmp != ',' and chTmp != ']' and chTmp != ' ' and chTmp != '\t':
                    bCorrectFormat = False
                    break
                if chTmp == ',' or chTmp == ']':
                    break
            elif nCheckPos == 6:  # array节点结束到下一个节点开始只能是,到{
                if chTmp != ',' and chTmp != '{' and chTmp != ' ' and chTmp != '\t':
                    bCorrectFormat = False
                    break
                if chTmp == ',' or chTmp == '{':
                    break
            elif nCheckPos == 7:
                if chTmp != ']' and chTmp != ' ' and chTmp != '\t':
                    bCorrectFormat = False
                    break
                if chTmp == ']':
                    bEndObject = True
                    break

        return bCorrectFormat, bEndObject


def printSingleObject(obj):
    print repr(obj)


def printObject(obj, nTab):
    print '\t' * (nTab-1), '{'
    for i in obj.dictResult:
        if isinstance(obj.dictResult[i], list):
            printList(obj.dictResult[i], nTab + 1, i)
        elif isinstance(obj.dictResult[i], JsonHelper):
            printObject(obj.dictResult[i], nTab + 1)
        else:
            print '\t' * nTab, '"{}":\t{}'.format(i, repr(obj.dictResult[i]))

    print '\t' * (nTab - 1), '}'


def printList(lst, nTab, strEleName = ''):
    if 0==len(strEleName):
        strEleName = ''
    else:
        strEleName = '"{}":'.format(strEleName)
    print '\t' * (nTab - 1), strEleName, '['
    for i in lst:
        if isinstance(i, list):
            printList(i, nTab + 1)
        elif isinstance(i, JsonHelper):
            printObject(i, nTab + 1)

    print '\t' * (nTab - 1), ']'


if __name__ == "__main__":

    try:
        str = '    [{\
      "userId": "111111111111",\
      "userName": "张三李四王麻子",\
      "us%e\\"r\\\\%c Pho\'n:e": "13030\\"rc Pho\'n:303131",\
      "userFollow": 86,\
      "userFuns": -2e-5,\
      "userFavorite": true,\
      "userEBuy": null,\
      "userComment": "999",\
      "userNews": "3",\
      "userPoints": "3",\
      "userOrder": "8",\
      "userLocation": "5",\
      "isSeller": "1",\
      "aaa": {\
         "userId": "2222222222222",\
         "userPhone": "13030303131",\
         "userFollow": "86",\
         "userFuns": "5125",\
         "userFavorite": "615",\
         "userEBuy": "103",\
         "userComment": "999",\
         "userNews": "3",\
         "userPoints": "3",\
         "userOrder": "8",\
         "userLocation": "5",\
         "isSeller": "1",\
         "bbb": {\
            "userId": "333333333333",\
            "userName": "张三李四王麻子",\
            "userPhone": "1303\\"0303131",\
            "userFollow": 86,\
            "userFuns": 66.66,\
            "userFavorite": true,\
            "userEBuy": null,\
            "userC\\"omment": "999",\
            "userNews": "3",\
            "userPoints": "3",\
            "userOrder": "8",\
            "userLocation": "5",\
            "isSeller": "1"\
         },\
         "ccc": {\
            "userId": "444444444444",\
            "userName": "张三李四王麻子",\
            "userPhone": "13030303131",\
            "userFollow": "86",\
            "userFuns": "5125",\
            "userFavorite": "615",\
            "userEBuy": "103",\
            "userComment": "999",\
            "userNews": "3",\
            "userPoints": "3",\
            "userOrder": "8",\
            "userLocation": "5",\
            "isSeller": "1",\
            "sdfsdf": {\
               "Name": "55555555555555",\
               "X": "85",\
               "Y": "78",\
               "Z": "10"\
            }\
         }\
      }\
   },\
   {\
      "userId": "66666666666666",\
      "userName": "张三李四王麻子",\
      "userPhone": "13030303131",\
      "userFollow": "86",\
      "userFuns": "5125",\
      "userFavorite": "615",\
      "userEBuy": "103",\
      "userComment": "999",\
      "userNews": "3",\
      "userPoints": "3",\
      "userOrder": "8",\
      "userLocation": "5",\
      "isSeller": "1",\
      "Values": [{\
            "Name": "7777777777777777",\
            "X": "85",\
            "Y": "78",\
            "Z": "10"\
         },\
         {\
            "Name": "8888888888888888",\
            "X": "85",\
            "Y": "78",\
            "Z": "10"\
         }\
      ]\
   }\
 ]'
        # str = '     [  {\
      #     "Name": "8888888888888888",\
      #     "X": "85",\
      #     "Y": "78",\
      #     "Z": null\
      #  }]'
        # str = '        {"bbb": {\
      #     "userId": "333333333333",\
      #     "userName": "张三李四王麻子",\
      #     "userPhone": "1303\\"0303131",\
      #     "userFollow": 86,\
      #     "userFuns": 66.66,\
      #     "userFavorite": true,\
      #     "userEBuy": null,\
      #     "userC\\"omment": "999",\
      #     "userNews": "3",\
      #     "userPoints": "3",\
      #     "userOrder": "8",\
      #     "userLocation": "5",\
      #     "isSeller": "1"\
      #  },\
      #  "ccc": {\
      #     "userId": "444444444444",\
      #     "userName": "张三李四王麻子",\
      #     "userPhone": "13030303131",\
      #     "userFollow": "86",\
      #     "userFuns": "5125",\
      #     "userFavorite": "615",\
      #     "userEBuy": "103",\
      #     "userComment": "999",\
      #     "userNews": "3",\
      #     "userPoints": "3",\
      #     "userOrder": "8",\
      #     "userLocation": "5",\
      #     "isSeller": "1",\
      #     "sdfsdf": {\
      #        "Name": "55555555555555",\
      #        "X": "85",\
      #        "Y": "78",\
      #        "Z": "10"\
      #     }\
      #  }}'

        # str = '[{\
      #     "Name": "7777777777777777",\
      #     "w": false,\
      #     "X": 85,\
      #     "Y": 78.66,\
      #     "Z": "10",\
      #     "we": null,\
      #     "us%e\\"r\\\\%c Pho\'n:e": "13030\\"rc Pho\'n:303131"\
      #  },\
      #  {\
      #     "Name": "8888888888888888",\
      #     "q": "85",\
      #     "w": "78",\
      #     "e": "10",\
      #     "sdfsdf": {\
      #        "Name": "9999999999999",\
      #        "a": "85",\
      #        "b": "78",\
      #        "c": "10"\
      #     }\
      #  }\
      # ]'
#         str = '{\
#  "Name": "7777777777777777",\
#  "w": false,\
#  "X": 85,\
#  "Y": 78.66,\
#  "Z": "10",\
#  "we": null,\
#  "us%e\\"r\\\\%c Pho\'n:e": "13030\\"rc Pho\'n:303131"\
# }'
#         str = '666666'
        jsObj = JsonHelper()
        jsObj.JsonParse(str)

        if jsObj.jsObjectType == JsonBaseType.object_type:
            printObject(jsObj.dictResult[''], 1)
        elif jsObj.jsObjectType == JsonBaseType.array_type:
            printList(jsObj.dictResult[''], 1)
        else:
            printSingleObject(jsObj.dictResult[''])

        print('json parsed success.')
    except ParseException as e:
        print(e)
        print('json parsed failed.')

    # debug(21361583)  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python json 解析 的相关文章

随机推荐

  • 基于Qt、FFMpeg的音视频播放器设计二(FFMpeg视频处理)

    在上一篇中我们介绍了如何在VS2013中配置文件以及FFMpeg的开发环境准备 xff0c 本篇我们说下视频处理的原理以及实现 对于视频的处理我们这里对它分开总结 xff0c 不然看起来会显得很冗余复杂 xff0c 不易理解 主要分为以下几
  • 基于Qt、FFMpeg的音视频播放器设计三(Qt界面设计及OpenGL绘制视频)

    本部分总结了一下界面绘制和OpenGL绘制视频 xff0c 由于使用的是Qt的openGL xff0c 功能上没有那么复杂 xff0c 实现起来也比较简单 xff0c 毕竟人家已经给封好的 xff0c 完整的代码中使用OpenGL绘制视频
  • 基于Qt、FFMpeg的音视频播放器设计四(视频播放进度控制)

    上面介绍了如何使用opengl绘制视频和Qt的界面设计 xff0c 也比较简单 xff0c 现在我们看下如何控制视频播放及进度的控制 xff0c 内容主要分为以下几个部分 1 创建解码线程控制播放速度 2 通过Qt打开外部视频 3 视频总时
  • VS2008中Unicode编码转UTF-8编码

    今天在pc客户端传数据 Json格式 给服务端时 在存储到数据库 Mysql 时总是出现乱码现象 xff0c 使用的是http协议 xff0c 以及json的解码 后一篇说明 这里我们先说下转码 在vs2008中编码方式有Unicode编码
  • 串口显示乱码的原因总结

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • Linux出现Input/output error

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • 错误 expected '}' before ' ' token

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • 浅谈C语言中的布尔(bool)类型

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • C++类成员空间分配和虚函数表

    C 43 43 类成员空间分配和虚函数表 xff0c 非常详细的一篇文章 xff0c 受益匪浅 https www cnblogs com secondtonone1 p 7205108 html utm source 61 itdadao
  • 外部时钟与内部时钟区别 作用 使用条件

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • Ghostscript的介绍和移植

    关于ghostscript 以下简称gs Gs是一个地下工作者 xff0c 一般用户不熟悉它 xff0c 因为它上不和用户直接打交道 xff0c 下不直接接触打印机 但是在打印工作中它却扮演了极为重要的解色 一般从用户常见文件如图片或者wo
  • PPPoE on Android

    分享一下我老师大神的人工智能教程 零基础 xff01 通俗易懂 xff01 风趣幽默 xff01 还带黄段子 xff01 希望你也加入到我们人工智能的队伍中来 xff01 https blog csdn net jiangjunshow P
  • 文件编程 创建目录mkdir 函数

    分享一下我老师大神的人工智能教程 零基础 xff01 通俗易懂 xff01 风趣幽默 xff01 还带黄段子 xff01 希望你也加入到我们人工智能的队伍中来 xff01 https blog csdn net jiangjunshow L
  • VFY unable to resolve virtual method Landroid/support/v4/

    分享一下我老师大神的人工智能教程 零基础 xff01 通俗易懂 xff01 风趣幽默 xff01 还带黄段子 xff01 希望你也加入到我们人工智能的队伍中来 xff01 https blog csdn net jiangjunshow 使
  • CUPS移植记录

    分享一下我老师大神的人工智能教程 零基础 xff01 通俗易懂 xff01 风趣幽默 xff01 还带黄段子 xff01 希望你也加入到我们人工智能的队伍中来 xff01 https blog csdn net jiangjunshow C
  • gazebo多机器人仿真和move_base,diff_drive等gazebo包配置

    gazebo中的多机器人仿真指的是在gazebo中加入多个urdf xff0c 并控制机器人运动 下面是我总结的一些名称的命名规律 1 joint名称 在spawn model中 xff0c 通过 model model name添加参数
  • Golang语言移植-ARM开发环境搭建

    开发环境介绍 主机操作系统 xff1a Ubuntu14 04 64位目标平台 xff1a IMX 6Q ARM Cortex A9内核交叉工具链 xff1a arm poky linux gnueabi xff0c gcc4 9 1Go版
  • #每周一篇论文4#[感知]毫米波雷达与摄像头联合标定

    文章目录 源代码下载系列其他资源一 坐标系说明1 1 摄像头相关坐标系1 2 毫米波雷达相关坐标系1 3 GPS相关坐标系1 4 车体相关坐标系1 5 其他坐标系1 5 1 左右手坐标系 二 毫米波和摄像机联合标定2 1 毫米波 O X r
  • 单目测距 视觉测距

    文章目录 单目测距在kitti数据集中的测试结果C 43 43 工程原理代码注释 其他视觉测距算法 基于相似三角形的单目测距算法原理代码 参考资料 单目测距 在kitti数据集中的测试结果 C 43 43 工程 C 43 43 工程代码下载
  • python json 解析

    coding utf 8 import sys os re class JsonBaseType single type 61 0 object type 61 1 array type 61 2 class ParseException