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

  

最新文章

  1. 在不损坏C盘的情况下为C盘扩容,适用于Win
  2. JS事件-事件处理程序-笔记总结ing...
  3. ZeroMQ接口函数之 :zmq_msg_data - 返回消息内容的指针
  4. Codeforces Round #333 (Div. 2)
  5. centos 6.5卸载Mysql
  6. find command in linux terminal
  7. JVM——类加载器的双亲委派模型
  8. 潘石屹的SOHO小报猝死
  9. re模块(正则表达式)
  10. Unity之流光效果
  11. hibernate的Could not execute JDBC batch update错误原因及处理
  12. IOP开发数据库--20180105整理
  13. CSS小知识-----前缀-moz-、-ms-、-webkit-,-o-分别代表的意思
  14. react中使用antd Table组件滚动加载数据的实现
  15. FIDDLER的使用方法及技巧总结(连载一)FIDDLER快速入门及使用场景
  16. codeforces 892 - A/B/C
  17. mysql 慢查询,查询缓存,索引,备份,水平分割
  18. 在Android 5.0中使用JobScheduler
  19. 从零开始学习MXnet(五)MXnet的黑科技之显存节省大法
  20. k8s-存储卷2-configMap-Secret-十三

热门文章

  1. ssis的script task作业失败(调用外部dll)
  2. vs 中一些快捷键
  3. javascript面向对象2
  4. .Net程序员的前端优化
  5. Couchbase 服务器
  6. Entity Framework,TransactionScope 混合使用的问题讨论
  7. C# dll 事件执行 js 回调函数
  8. Toad for Oracle的安装
  9. C++ builder 中AnsiString的字符串转换方法大全
  10. BT是如何下载的