我想用Python创建一个JSON文件。 JSON结构如下:
{
"index_pattern" : "all_packets"
"packets" : [
{
"packet_type" : "TCP"
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
},
{
"packet_type" : "ICMP"
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
}
]
}
每当我使用wireshark模块捕获数据包时,我都想添加该数据包以说出myoutput.json文件。问题是,使用
之类的东西f = open("myoutput.json", "a")
f.write({
"packet_type" : "ICMP"
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
})
不适合,因为我没有正常关机,也无法添加必要的结束括号来完成JSON。所以我需要在数据包数组之间写。实现此目标的最佳方法是什么。
答案 0 :(得分:1)
编写文件时:
import json
with open('myoutput.json', 'a') as fo:
json.dump({
"packet_type" : "ICMP",
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
}, fo)
读取文件时,请执行以下操作:
with open('myoutput.json') as fo:
data = fo.read()
data = data.replace('}{', '},{')
data = '[' + data + ']'
data = json.loads(data)
result = {"index_pattern" : "all_packets",
"packets": data}
您还可以创建一个帮助器类来完成它:
import json
class WriteObject:
def __init__(self, fname='myoutput.json'):
self.fname = fname
def push(self, data):
# data_example={
# "packet_type" : "ICMP",
# "source_ip" : "192.168.0.2",
# "destination_ip" : "192.168.0.114"
# }
with open(self.fname, 'a') as fo:
json.dump(data, fo)
def get_all(self):
with open(self.fname) as fo:
data = fo.read()
data = data.replace('}{', '},{')
data = '[' + data + ']'
data = json.loads(data)
result = {"index_pattern" : "all_packets",
"packets": data}
return result
# usage
obj = WriteObject()
obj.push({
"packet_type" : "ICMP",
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
})
答案 1 :(得分:0)
一个可能的解决方案是json.load
将整个文件放入python对象,例如data
并将packet
附加到data["packets"]
。然后,您需要将更新后的data
写回到json文件。
这种方法的缺点是需要不断地将数据读写到json文件中。
可以通过汇总数据包列表(因此将数据包临时保存到packets
列表)并仅在达到某个预定义大小时更新json文件(例如,当len(packets) == 20
时)来改进它。之后,您可以清空packets
,然后再次开始将数据收集到其中。