详解
json格式数据示例
[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]
{}
花括号内为一个对象,内含key-value键值对,用双引号包裹key,value可以存多种数据类型
数据类型表示
数据结构:
array(数组)、object(对象)
数组:[obj,obj,obj]
[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4},{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]
对象:{key:obj,key:obj}
{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}
两种数据结构可以互相嵌套:
[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4},{"a": [1,2,3] ,"c": 3, "b": 2, "e": 5, "d": 4}]
基本类型:string,number,true,false,null
解析json数据
一般解析JSON数据时,需要获取JSON数据的途径,这个途径可能是文件读取或远程API网络上获取JSON数据
python解析json
处理json的函数
- dump 处理文件,将Python内置类型序列化为json对象后写入文件
- load 处理文件,读取文件中json形式的字符串元素转化为Python类型
- dumps 内存中转换,将 Python 对象编码成 JSON 字符串
- loads 内存中转换,将已编码的 JSON 字符串解码为 Python 对象
使用时要分清dump/dumps,load/loads,不然会出现json解析错误
dump/load是处理从文件读取的json
从文件读取
从.json
文件读取
某些扫描器支持json格式的输出,处理数据的时候可以直接处理.json
文件
masscan.json
[
{ "ip": "192.168.51.217", "timestamp": "1596533485", "ports": [ {"port": 49155, "proto": "tcp", "status": "open", "reason": "syn-ack", "ttl": 127} ] }
,
{ "ip": "192.168.51.217", "timestamp": "1596533485", "ports": [ {"port": 9999, "proto": "tcp", "status": "open", "reason": "syn-ack", "ttl": 127} ] }
]
处理代码
os.system("./masscan -Pn --rate 10000 --wait 1 -p1-65535 -iL ips.txt -oJ result.json")
with open("masscan.json",encoding='utf-8') as f:
data = json.load(f)
ip_port = []
for d in data:
d_json={}
d_json['ip'] = d['ip']
for p in d['ports']:
d_json['port'] = p['port']
ip_port.append(d_json)
print(ip_port)
这里有个麻烦的地方,因为python内置数据类型没有json的,所以从json解析到python对象之后要处理各种格式的嵌套,比如这个,list里有dict,dict里的ports值又是list的。。。一层层取呗还能咋办
从API获取
网页返回的结果实际上是str类型,但是json格式的。所以直接解析返回结果可以得到python内置的数据类型(list或者dict)
格式
["{\"ip\":\"23.253.112.152\"}","{\"ip\":\"23.253.112.153\"}","{\"ip\":\"50.56.137.245\"}","{\"ip\":\"50.56.137.246\"}","{\"ip\":\"50.56.154.86\"}","{\"ip\":\"50.56.154.87\"}","{\"ip\":\"50.56.154.88\"}","{\"ip\":\"50.56.154.111\"}","{\"ip\":\"58.217.193.1\"}","{\"ip\":\"58.217.193.2\"}","{\"ip\":\"58.217.193.3\"}","{\"ip\":\"58.217.193.4\"}","{\"ip\":\"58.217.193.5\"}","{\"ip\":\"58.217.193.6\"}","{\"ip\":\"58.217.193.7\"}"]
数据处理:解析json数据,按行将 ip写入txt
一开始以为是list包含json,用了一个笨办法解析
r = requests.post(url=get_ip,data=get_ip_data)
if r:
r_list = eval(r.text)
else:
print("none")
for i in r_list:
ips=json.loads(i).get('ip')
writeFile(local_path,ips)
实际上,python的基本数据类型里没有json,request内置json()可以直接解析json数据,将json数据转换为python内置对象,但如果返回的不是json格式,就会报错
r = requests.post(url=get_ip,data=get_ip_data)
r_list = r.json()
for i in r_list:
ips=json.loads(i).get('ip')
print(ips)
像上面的格式,r.json()
解析后的数据类型为list里嵌套str,所以需要再做一次转换,将str{\"ip\":\"23.253.112.152\"}
转成dict,dict.get()
方法取值