从python解析理解JSON

详解

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()方法取值

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值