Вывод нежелательного символа \ в .json документ

Рейтинг: 1Ответов: 1Опубликовано: 09.01.2023

Мой код выводит в json документ символ \. Подскажите, как можно это исправить

import json
import socket
from ping3 import ping

ports = [20, 21, 22, 23, 25, 43, 53, 80,
         115, 123, 143, 161, 179, 443, 445,
         514, 515, 993, 995, 1080, 1194,
         1433, 1723, 3128, 3268, 3306, 3389,
         5432, 5060, 5900, 8080, 10000]

services = [
    "FTP-DATA", "FTP", "SSH", "Telnet", "SMTP", "WHOIS", "DNS", "http", "SFTP", "NTP", "IMAP", "SNMP", "BGP", "HTTPS",
    "MICROSOFT-DS", "SYSLOG", "PRINTER", "IMAPS", "POP3S", "SOCKS", "OpenVPN", "SQL Server", "PPTP", "HTTP", "LDAP",
    "MySQL", "RDP", "PostgreSQL", "VNC", "Tomcat", "Webmin"]

with open('list_of_hosts.txt') as f:
    num_lines = len(f.readlines())

hosts_website = []
hosts_web = []


def scan_and_write(host_name):
    host_ping = ping(host_name)

    if host_ping is not False:
        ip = socket.gethostbyname(host_name)
        json_data = [{"hostname": f"{host_name}", "ports": [{}]}]

        for a in range(len(ports)):
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            socket.setdefaulttimeout(0.01)
            result = s.connect_ex((ip, ports[a]))
            if result == 0:
                json_data[0]["ports"][0][ports[a]] = services[a]
                return json.dumps(json_data)

    else:
        json_data = [{"hostname": f"{host_name}"}]
        return json.dumps(json_data)


with open('../pythonProject/list_of_hosts.txt') as f:
    i = 0
    for i in range(num_lines):
        line = f.readline()
        if 'website' in line:
            hosts_website.append(line.rstrip('\n'))

with open('../pythonProject/list_of_hosts.txt') as f:
    i = 0
    for i in range(num_lines):
        line = f.readline()
        if 'web' in line:
            hosts_web.append(line.rstrip('\n'))

    data_website = []
    data_web = []

with open('hosts.json', "w") as f:

    json_website_and_web = {"website.ru": data_website, "web.com": data_web}

    for i in range(len(hosts_website)):
        data_website.append(scan_and_write(host_name=hosts_website[i]))

    for i in range(len(hosts_lmru)):
        data_web.append(scan_and_write(host_name=hosts_web[i]))

    d.write(json.dumps(json_website_and_web))

получается примерно следующее

{"website.ru": ["[{\"hostname\": \"test.website.ru\", \"ports\": [{\"80\": \"http\"}]}]"}, "web.com": ["[{\"hostname\": \"test.web.com\"}]"]}

Ответы

▲ 2

у вас scan_and_write возвращает строку. поэтому эта строка при последующей >сериализации словаря json_website_and_web экранируется. возвращайте из >scan_and_write не строку, а json_data – Nofate

Nofate, спасибо вам. Это помогло

if host_ping is not False:
        ip = socket.gethostbyname(host_name)
        json_data = [{"hostname": f"{host_name}", "ports": [{}]}]

        for a in range(len(ports)):
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            socket.setdefaulttimeout(0.01)
            result = s.connect_ex((ip, ports[a]))
            if result == 0:
                json_data[0]["ports"][0][ports[a]] = services[a]
                return json_data # UPD

    else:
        json_data = [{"hostname": f"{host_name}"}]
        return json_data # UPD