#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<len(self._str) and self._str[self._index] in ' \n\t\r': 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<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)