Search code examples
pythonjsonjson2html

json2html python lib is not working


I'm trying to create new json file with my custom json input and converting JSON to HTML format and saving into .html file. But I'm getting error while generating JSON and HTML file. Please find my below code - Not sure what I'm doing wrong here:

#!/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)

Can someone please help me resolve this issue.

Thanks!


Solution

  • First, get rid of your try / except. Using except without a type expression is almost always a bad idea. In this particular case, it prevented you from knowing what was actually wrong.

    After we remove the bare except:, we get this useful error message:

    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
    

    Sure enough, JsonResponse isn't a character string (str), but is a dictionary. This is easy enough to fix:

        file.write(json.dumps(JsonResponse))
    

    Here is a create() subroutine with some other fixes I recommend. Note that writing the dumping the JSON followed immediately by loading the JSON is usually silly. I left it in assuming that your actual program does something slightly different.

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