• Python json解析


    #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]!='
    ': #删除空格和换行符,但是json双引号中的内容空格不能删除
    			str+=eachLine[i]
    	return str
    
    
    class jsonparser:
    
    	def __init__(self, str=None):
    		self._str = str
    		self._index=0
    
    	def _skipBlank(self):  
    		'''
    		跳过空白、换行或tab: 
    	
    		'''
    		while self._index<len(self._str) and self._str[self._index] in ' 
    	
    ':
    			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]=='\': #重点!出现,表明其后面的是配合的转义符号,如",	,
    ,主要针对"的情况
    				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=' 
    	
    ,}]' #数字结束的字符串
    		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<len(self._str):
    			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)
    

      

  • 相关阅读:
    [转载]centos 6.4中git如何正常显示中文
    [转载] 在Linux中,开机自动运行普通用户的脚本程序
    elasticsearch中的filter与aggs
    GET和POST的区别
    Java NIO读书笔记2
    Java NIO读书笔记
    java之并发
    java中参数传递
    java中final关键字
    Java类的初始化过程及清理
  • 原文地址:https://www.cnblogs.com/kuihua/p/6291050.html
Copyright © 2020-2023  润新知