#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)