Create / Load json files (json.decoder.JSONDecodeError: Extra data:)

Expecting

I am expecting to create/add new record and load json files using python.

Json Result

{
    "2313213": [
        {
            "_aliasinput": "2313213",
            "_idinput": "321",
            "_timesinput": []
        }
    ]
}{
    "321312312": [
        {
            "_aliasinput": "321312312",
            "_idinput": "534342",
            "_timesinput": []
        }
    ]
}{
    "31232131": [
        {
            "_aliasinput": "31232131",
            "_idinput": "3123129312",
            "_timesinput": [
                "10:29"
            ]
        }
    ]
}

I m not sure if JSON is well formatted. Maybe should it be any error when creating this file? What is the best and correct thing to do on this case? i expect return and print that values on terminal on this project that’s why i need to understand what is wrong on this code. As you can see i have a input with a list of values. Hope you could me help on that.

Error:

First time it works well, but 2nd time get the error below, seems that json it not created correct.

json.decoder.JSONDecodeError: Extra data: line 9 column 2 (char 145) 

Any idea where is my error? Hope you help me on this issue.

Code to create json

import os
import json


alias_input = input("Alias input:n:> ")
id_input = input("ID input:n:> ")
times_input = [item for item in input("Times input:n:> ").split()]


def save():
    filename = "config"
    if filename == "":
        print("Insert a profile name")
    else:
        line = [dict(_aliasinput=alias_input, _idinput=id_input, _timesinput=times_input)]
        line_save = { alias_input : line }
        profile = open('config'+filename+'.json', 'w')
        if not os.path.exists('config'):
            os.makedirs('config')
        with open('config/'+filename+'.json', 'a') as outfile:
            json.dump(line_save, outfile, indent=4, sort_keys=False)
            profile.close()
            print("Profile", filename, "is saved.")
            

save()

Code to load json

import os
import json


alias_input2 = input("Alias input:n:> ")

def load():
    filename = "config.json"
    if filename == "":
            print("Insert a profile name")
    else:
        with open('config/'+'config'+'.json', 'r') as outfile:
            data = json.load(outfile)
            
            for element in data[alias_input2]:

                alias_input = (element['_aliasinput'])
                id_input = (element['_idinput'])
                times_input = (element['_timesinput'])
                
                position = 0
                position += 1
                print(f"({position}) Alias input: {alias_input} ID input: {id_input} Times input: {times_input}")

            
            outfile.close()
            
            

load()

Answer

Having a JSON file with multiple entities is not valid, so you have to change your JSON file structure to this:

[
{
    "2313213": [
        {
            "_aliasinput": "2313213",
            "_idinput": "321",
            "_timesinput": []
        }
    ]
},
{
    "321312312": [
        {
            "_aliasinput": "321312312",
            "_idinput": "534342",
            "_timesinput": []
        }
    ]
},
{
    "31232131": [
        {
            "_aliasinput": "31232131",
            "_idinput": "3123129312",
            "_timesinput": [
                "10:29"
            ]
        }
    ]
}
]

a JSON file contains a single entity that can contain multiple objects. so, the code must change to something like this:

loaded_list: list = load_json()

loaded_list.append(create_object())

save_json(loaded_list)

# save_json function must replace the old JSON file with the new one

The problem with your code is the save function, you save it in an inappropriate format (by using a switch, you just append a new JSON object to the old one on the file, so it makes it an invalid JSON file), hence when it attempts to load it with json.load in load function, it will raise that exception.

your code must change to something like this:

import json
import os


def producer():
    return {
        "321312312": [
            {
                "_aliasinput": "321312312",
                "_idinput": "534342",
                "_timesinput": []
            }
        ]
    }


to_write = [producer() for _ in range(10)]  # just a faker to reproduce the data


def save():
    if not os.path.exists('file.json'):
        with open('file.json', 'w') as file:
            json.dump([], file)  # create an initial json file

    with open('file.json', '+r') as file:
        previous_data: list = json.load(file)  # load previous data, surly we excpect to be a list
        file.seek(0)
        previous_data.extend(to_write)  # add new data to old ones
        json.dump(previous_data, file)  # replace the extend list to the json file
        file.truncate()


def load():
    with open('file.json', 'r') as file:
        data: list = json.load(file)

    return data