1

我正在尝试使用我的自定义 json 输入创建新的 json 文件并将 JSON 转换为 HTML 格式并保存到 .html 文件中。但是在生成 JSON 和 HTML 文件时出现错误。请找到我下面的代码 - 不知道我在这里做错了什么:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from json2html import *
import sys
import json

JsonResponse = {
        "name": "json2html",
        "description": "Converts JSON to HTML tabular representation"
}

def create(JsonResponse):
    #print JsonResponse
    print 'creating new  file'
    try:
        jsonFile = 'testFile.json'
        file = open(jsonFile, 'w')
        file.write(JsonResponse)
        file.close()
        with open('testFile.json') as json_data:
            infoFromJson = json.load(json_data)
            scanOutput = json2html.convert(json=infoFromJson)
            print scanOutput
            htmlReportFile = 'Report.html'
            htmlfile = open(htmlReportFile, 'w')
            htmlfile.write(str(scanOutput))
            htmlfile.close()
    except:
        print 'error occured'
        sys.exit(0)


create(JsonResponse)

有人可以帮我解决这个问题。

谢谢!

4

2 回答 2

0

首先,摆脱你的try/ except。在没有类型表达式的情况下使用except几乎总是一个坏主意。在这种特殊情况下,它使您无法知道实际出了什么问题。

在我们删除 bare 之后except:,我们会得到这个有用的错误信息:

Traceback (most recent call last):
  File "x.py", line 31, in <module>
    create(JsonResponse)
  File "x.py", line 18, in create
    file.write(JsonResponse)
TypeError: expected a character buffer object

果然,JsonResponse不是字符串(str),而是字典。这很容易解决:

    file.write(json.dumps(JsonResponse))

这是create()我推荐的其他一些修复的子例程。请注意,编写转储 JSON 然后立即加载 JSON 通常是愚蠢的。我假设你的实际程序做了一些稍微不同的事情。

def create(JsonResponse):
    jsonFile = 'testFile.json'
    with open(jsonFile, 'w') as json_data:
        json.dump(JsonResponse, json_data)
    with open('testFile.json') as json_data:
        infoFromJson = json.load(json_data)
        scanOutput = json2html.convert(json=infoFromJson)
        htmlReportFile = 'Report.html'
        with open(htmlReportFile, 'w') as htmlfile:
            htmlfile.write(str(scanOutput))
于 2017-04-13T17:31:40.697 回答
0

错误是在写入 JSON 文件时。而不是file.write(JsonResponse)你应该使用json.dump(JsonResponse,file). 它会起作用的。

于 2017-04-13T17:52:09.710 回答