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

Python 连续写入包含数组的JSON文件,python,json,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" }, {

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

写入文件时:

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"
          })

一种可能的解决方案是
json。将整个文件加载到python对象中,比如
data
,然后将
数据包添加到
数据[“数据包”]
。然后您需要将更新的
数据
写回json文件。
这种方法的缺点是需要不断地将数据读写到json文件中


它可以通过聚合数据包列表(这样您可以临时将数据包保存到
packets
list)并仅在json文件达到某个预定义大小时(例如,当
len(packets)==20
时)更新json文件来改进。之后,您可以清空
数据包
并再次开始收集数据。

但您是否确实检查了代码是否正常工作?@taras,是的,在Jupyter!嗨,谢谢你的回答。更清楚地说,我想在文件中的packets字段中做一个push操作。为了演示它的相似之处,myoutput.json[“packets”].push({“packet_type”:“ICMP”,“source_ip”:“192.168.0.2”,“destination_ip”:“192.168.0.114”})解决方案和类实现解决了它。多亏了你们大家,你们能把这个存储在NoSQL数据库中,然后把数据包发送给那个数据库吗?嗨,谢谢你们的关注。我的项目需求是创建一个JSON文件作为另一个程序(比如X)可以读取的输出。程序X已经使用了ElasticSearch,所以我们可能不会在项目中使用其他存储工具。这就是为什么我猜不出来。@doctorlove医生