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断言. 当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间.一直在寻 ...
随机推荐
- iOS_1_加法器
: BeyondViewController.h // // BeyondViewController.h // 01_calc // // Created by beyond on 14-7-20. ...
- bat批量目光声明
写bat同一批次,盯着函数应使用.这个程序对可读性 在批处理,凝视节还有一种更常用的方法: goto start = 能够是多行文本,能够是命令 = 能够包括重定向符号和其它特殊字 ...
- 转: js快速分享代码
这是一款简单易用的文章分享工具,您只需将下面的html代码拷贝到模板中就可以实现文章快速分享功能.如果您想分享你的博客.个人网站或者企业网站等等,下面是两款不错的分享工具,值得拥有! 1. [html ...
- 20个很有用的CSS技巧
导语:下面这几个CSS技巧你可能不知道,1.彩色照片变黑白,2.所有元素垂直居中,3.禁用鼠标,4.模糊文字,小编学完能量满满的,觉得对CSS又充满了爱,你也来看看. 1. 黑白图像 这段代码会让你的 ...
- GridView中两个DropDownList联动
GridView中两个DropDownList联动 http://www.cnblogs.com/qfb620/archive/2011/05/25/2057163.html Html: <as ...
- C#编程断点续传
C#编程总结(十二)断点续传 Posted on 2014-02-16 10:56 停留的风 阅读(384) 评论(3) 编辑 收藏 C#编程总结(十二)断点续传 我们经常使用下载工具,如bit精灵. ...
- iOS基础 - UITableView的数据源和代理
一.UITableView的代理方法 #pragma mark 每一行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtI ...
- js模版引擎handlebars.js实用教程
js模版引擎handlebars.js实用教程 阅读本文需要了解基本的Handlebars.js概念,本文并不是Handlebars.js基础教程,而是注重于实际应用,为读者阐述使用过程中可能会遇到的 ...
- 高级NAT-DMZ配置 -虚拟主机配置
我家里另有一个网络摄像头,我想将公网IP映射到摄像头的IP,这样可以远程监控.以前没有光猫,用TP-Link做ADSL路由器,一点问题都没有. 现在破解了F420,在“高级NAT”-“DMZ配置”,或 ...
- Eclipse添加Web和java EE插件
1.在Eclipse中菜单help选项中选择install new software选项 2.在work with 栏中输入 Juno - http://download.eclipse.org/re ...