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]!='\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':
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)
Python json解析的更多相关文章
- 关于Python json解析过程遇到的TypeError: expected string or buffer
关于Python json解析过程遇到的问题:(爬取天气json数据所遇到的问题http://tianqi.2345.com/) part.1 url——http://tianqi.2345.com/ ...
- python json 解析
Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数. dic1 = {'type':'dic1','username':'loleina',' ...
- python json解析字符串出错该如何排查问题
每天写一点,总有一天我这条咸鱼能变得更咸 python中对于字符串转json格式有专门的json库可以操作 #!/usr/bin/env python # -*- coding: utf-8 -*- ...
- 接口测试02 - 无法绕过的json解析
概述: 先瞧一下什么是json.JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式. 它基于ECMAScript(w3c定制的js规范)的一个子集 ...
- python 中的json解析库
当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...
- python脚本解析json文件
python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...
- Python -- Json 数据编码及解析
Python -- Json 数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本 ...
- python入门(十):XML和JSON解析
一.python解析XML 1.xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合,注意xml.dom包里面有许多模块,须区分它们间的不同: 2.xml. ...
- python接口自动化--json解析神器jsonpath
前言 做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言. 当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间.一直在寻 ...
随机推荐
- html中静态进度条的实现
代码如下: <div> <div style="position: relative; height: 20px; width: 500px; border: 1px so ...
- Introducing ASP.NET vNext and MVC 6
[译]Introducing ASP.NET vNext and MVC 6 原文:http://www.infoq.com/news/2014/05/ASP.NET-vNext?utm_source ...
- ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言) 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方 ...
- C语言练习-学生信息管理系统
题目要求: 学生信息管理系统struct studentInfo{ int id; char name[128]; int age; char sex; int c_score; int cpp_sc ...
- 1关于script标签属性,注意点,浏览器文档模式,各种数据类型的转化
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SublimeText编辑器替代notepad++了
可以考虑使用SublimeText编辑器替代notepad++了 内容目录: 插件安装配置 配置打包下载 大概是去年吧,这款编辑器神一般的出现在我面前,经过我小心翼翼的试用后发现并不是那么太顺手, ...
- web-worker计数器,根据输入时间统计次数
1.用web-worker实现:另起一个线程,将计数工作运行在后台的JavaScript文件,并返回累加后的结果. 该js文件运行于后台,独立于其他脚本,不会影响页面的性能.html页面可以继续做任何 ...
- Jquery文本框值改变事件兼容性
Jquery文本框值改变事件(支持火狐.ie) Jquery值改变事件支持火狐和ie浏览器,并且测试通过,绑定后台代码可以做成autocomplete控件. 具体代码列举如下: ? $(docum ...
- 论公司spring的滥用
这个公司每个项目用不同的一套开发框架,实在忍不住拿一个出来说说事.
- jquery设置元素的readonly和disabled【转】
Jquery的api中提供了对元素应用disabled和readonly属性的方法,在这里记录下.如下: 1.readonly $('input').attr("readonly&qu ...