热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonjson解析转义_Pythonjson解析

#encoding:utf-8Author:Siukwanimportsysreload(sys)sys.setdefaultencoding(utf8)importjsondef

#encoding: utf-8

'''

Author:Siukwan

'''

import sys

reload(sys)

sys.setdefaultencoding('utf8')

import json

def txt2str(file='jsondata2.txt'):

'''

打开指定的json文件

'''

fp=open(file)

allLines = fp.readlines()

fp.close()

str=""

for eachLine in allLines:

#eachLine=ConvertCN(eachLine)

#转换成字符串

for i in range(0,len(eachLine)):

#if eachLine[i]!= ' ' and eachLine[i]!= '' and eachLine[i]!='\n': #删除空格和换行符,但是json双引号中的内容空格不能删除

str+=eachLine[i]

return str

class jsonparser:

def __init__(self, str=None):

self._str = str

self._index=0

def _skipBlank(self):

'''

跳过空白、换行或tab: \n\t\r

'''

while self._index

self._index=self._index+1

def parse(self):

'''

进行解析的主要函数

'''

self._skipBlank()

if self._str[self._index]=='{':

self._index+=1

return self._parse_object()

elif self._str[self._index] == '[':

self._index+=1

return self._parse_array()

else:

print "Json format error!"

def _parse_string(self):

'''

找出两个双引号中的string

'''

begin = end =self._index

#找到string的范围

while self._str[end]!='"':

if self._str[end]=='\\': #重点!出现\,表明其后面的是配合\的转义符号,如\",\t,\r,主要针对\"的情况

end+=1

if self._str[end] not in '"\\/bfnrtu':

print

end+=1

self._index = end+1

return self._str[begin:end]

def _parse_number(self):

'''

数值没有双引号

'''

begin = end = self._index

end_str=' \n\t\r,}]' #数字结束的字符串

while self._str[end] not in end_str:

end += 1

number = self._str[begin:end]

#进行转换

if '.' in number or 'e' in number or 'E' in number :

res = float(number)

else:

res = int(number)

self._index = end

return res

def _parse_value(self):

'''

解析值,包括string,数字

'''

c = self._str[self._index]

#解析对象

if c == '{':

self._index+=1

self._skipBlank()

return self._parse_object()

#解析数组

elif c == '[':

#array

self._index+=1

self._skipBlank()

return self._parse_array()

#解析string

elif c == '"':

#string

self._index += 1

self._skipBlank()

return self._parse_string()

#解析null

elif c=='n' and self._str[self._index:self._index+4] == 'null':

#null

self._index+=4

return None

#解析bool变量true

elif c=='t' and self._str[self._index:self._index+4] == 'true':

#true

self._index+=4

return True

#解析bool变量false

elif c=='f' and self._str[self._index:self._index+5] == 'false':

#false

self._index+=5

return False

#剩下的情况为number

else:

return self._parse_number()

def _parse_array(self):

'''

解析数组

'''

arr=[]

self._skipBlank()

#空数组

if self._str[self._index]==']':

self._index +=1

return arr

while True:

val = self._parse_value() #获取数组中的值,可能是string,obj等等

arr.append(val) #添加到数组中

self._skipBlank() #跳过空白

if self._str[self._index] == ',':

self._index += 1

self._skipBlank()

elif self._str[self._index] ==']':

self._index += 1

return arr

else:

print "array parse error!"

return None

def _parse_object(self):

'''

解析对象

'''

obj={}

self._skipBlank()

#空object

if self._str[self._index]=='}':

self._index +=1

return obj

#elif self._str[self._index] !='"':

#报错

self._index+=1 #跳过当前的双引号

while True:

key = self._parse_string() #获取key值

self._skipBlank()

self._index = self._index+1#跳过冒号:

self._skipBlank()

#self._index = self._index+1#跳过双引号

#self._skipBlank()

#获取value值,目前假设只有string的value和数字

obj[key]= self._parse_value()

self._skipBlank()

#print key,":",obj[key]

#对象结束了,break

if self._str[self._index]=='}':

self._index +=1

break

elif self._str[self._index]==',':#还存在其他对象

self._index +=1

self._skipBlank()

self._index +=1#跳过下一个对象的第一个双引号

return obj#返回对象

def display(self):

displayStr=""

self._skipBlank()

while self._index

displayStr=displayStr+self._str[self._index]

self._index=self._index+1

self._skipBlank()

print displayStr

def _to_str(pv):

'''把python变量转换成string'''

_str=''

if type(pv) == type({}):

#处理对象

_str+='{'

_noNull = False

for key in pv.keys():

if type(key) == type(''):

_noNull = True #对象非空

_str+='"'+key+'":'+_to_str(pv[key])+','

if _noNull:

_str = _str[:-1] #把最后的逗号去掉

_str +='}'

elif type(pv) == type([]):

#处理数组

_str+='['

if len(pv) >0: #数组不为空,方便后续格式合并

_str += _to_str(pv[0])

for i in range(1,len(pv)):

_str+=','+_to_str(pv[i])#因为已经合并了第一个,所以可以加逗号

_str+=']'

elif type(pv) == type(''):

#字符串

_str = '"'+pv+'"'

elif pv == True:

_str+='true'

elif pv == False:

_str+='false'

elif pv == None:

_str+='null'

else:

_str = str(pv)

return _str

#main函数

if __name__ == '__main__':

print "test"

'''

jsonInstance=jsonparser(txt2str())

jsonTmp = jsonInstance.parse()

print jsonTmp

print jsonTmp['obj1']['family']['father']

print jsonTmp['obj1']['family']['sister']

print ' '

jsonInstance=jsonparser(txt2str('jsondataArray.txt'))

jsonTmp = jsonInstance.parse()

print jsonTmp

print ' '

'''

jsonInstance=jsonparser(txt2str('jsonTestFile.txt'))

jsonTmp = jsonInstance.parse()

print jsonTmp

print _to_str(jsonTmp)

print ' '

jsonInstance=jsonparser(txt2str('json.txt'))

jsonTmp = jsonInstance.parse()

print jsonTmp

print _to_str(jsonTmp)



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
飛仔2502897013
这个家伙很懒,什么也没留下!
RankList | 热门文章