连续写入包含数组的JSON文件

时间:2019-03-22 10:29:46

标签: python json

我想用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。所以我需要在数据包数组之间写。实现此目标的最佳方法是什么。

2 个答案:

答案 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,然后再次开始将数据收集到其中。