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

  

Python json解析的更多相关文章

  1. 关于Python json解析过程遇到的TypeError: expected string or buffer

    关于Python json解析过程遇到的问题:(爬取天气json数据所遇到的问题http://tianqi.2345.com/) part.1 url——http://tianqi.2345.com/ ...

  2. python json 解析

    Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数. dic1 = {'type':'dic1','username':'loleina',' ...

  3. python json解析字符串出错该如何排查问题

    每天写一点,总有一天我这条咸鱼能变得更咸 python中对于字符串转json格式有专门的json库可以操作 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  4. 接口测试02 - 无法绕过的json解析

    概述: 先瞧一下什么是json.JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式. 它基于ECMAScript(w3c定制的js规范)的一个子集 ...

  5. python 中的json解析库

    当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...

  6. python脚本解析json文件

    python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...

  7. Python -- Json 数据编码及解析

    Python  --  Json  数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本 ...

  8. python入门(十):XML和JSON解析

    一.python解析XML 1.xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合,注意xml.dom包里面有许多模块,须区分它们间的不同: 2.xml. ...

  9. python接口自动化--json解析神器jsonpath

    前言 做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言. 当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间.一直在寻 ...

随机推荐

  1. CRT

    G - 中国剩余定理 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit S ...

  2. 【UNIX网络编程(一)】套接字地址结构、网络字节顺序和地址转换功能

    介绍:应该用在网络编程实现每个套接字地址结构.所以主套接字地址结构后前提网络计划编制,地址结构可以在两个方向上发送:从工艺到内核和内核处理.构中的二进制值之间进行转换. 大多数套接字函数都须要一个指向 ...

  3. Android项目---webView

    之前用webView的时候,只知道它可以加载出html页面,竟然不知道,它也可以与js进行交互. WebView是一个网络视图,能加载显示网页,可以将它看作一个浏览器.它使用WebKit渲染引擎加载显 ...

  4. Coffee

    Coffee 从接触Spring 到现在已经差不多2年多了,期间用它做过几个项目,从个人使用角度来说,Spring无疑是非常的成熟和方便的,但是知道怎么用,却不知道原理是码农和攻城师的区别,现在准备自 ...

  5. quartz_spring 定时器配置

    quartz:石英,表达精确准时的意思. quartz-all-1.6.1.jar 主要用于定时任务管理. <?xml version="1.0" encoding=&quo ...

  6. 了解mongoDB存储结构

    mongoDB 深入浅出一 了解mongoDB存储结构   MongoDB 深入浅出 数据逻辑结构 1 mongoDB中的文档(document) 相当于 关系性数据库的一条一条的记录 2 colle ...

  7. Binder机制,从Java到C (7. Native Service)

    1.什么是NativeService Native Service,是通过C或C++代码写出來,提供给Java进行远程调用的RemoteService.向Android开机就启动的surfacefli ...

  8. probuf了解

    人们一直在强调,同 XML 相比, Protobuf 的主要优点在于性能高.它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍. 对于这些 “小 3 到 10 倍”, ...

  9. 学习ExpressionTree(做装配脑袋出的练习题)

    1 // 第一题:画出下列表达式的表达式树.一开始,您很可能不知道某些操作其实也是表达式(比如取数组的运算符a[2]),不过没有关系,后面的习题将帮你验证这一点. //-a ParameterExpr ...

  10. 更好的抽屉效果(ios)

    昨天项目基本没啥事了,晚上早早的就回家了,躺在床上无聊地玩着手机(Android的),在清理系统垃圾时被一个“360手机助手”给吸引了, 其实我是被它的那个抽屉效果给吸引了,此时你也许会觉得我out了 ...