Dumping a JSON array to Python doesn't work

When I try to dump a JSON array from a file as a list in Python it gives me a string. Instead, I want to get a list to be able to modify it.

The code:

import json
hola = []
f = open("prueba.json", "r")
file_data = json.loads(f.read())

print(file_data)

The content of the JSON file (prueba.json):

"[\"sbs\", \"sb\", \"bs\", \"v\", \"\"]"

The output:

["sbs", "sb", "bs", "v", ""]

But, when I put the same content in a variable, it works perfectly fine and it returns a list.

The code:

import json
hola = []
f = "[\"sbs\", \"sb\", \"bs\", \"v\", \"\"]"
file_data = json.loads(f)

print(file_data)

The output:

['sbs', 'sb', 'bs', 'v', '']

How can I make the first case return me a list, instead of a string?

1 answer

  • answered 2021-10-25 06:15 Mark Tolonen

    But, when I put the same content in a variable, it works perfectly fine and it returns a list.

    Because, that isn't the same content as the file. I created a file with the content you describe:

    import json
    
    with open('prueba.json') as f:
        data = f.read()
    print(data)
    
    f = "[\"sbs\", \"sb\", \"bs\", \"v\", \"\"]"
    print(f == data, f)   # (False) no this isn't the same content
    
    f2 = r'"[\"sbs\", \"sb\", \"bs\", \"v\", \"\"]"'
    print(f2 == data, f2) # (True) f2 is the same file content.  Need the quotes
                          # and literal backslashes, hence use of raw string
    
    # Your data is a JSON dump of string created by a JSON dump (double encoded)
    file_data = json.loads(data)      # decode once
    print(type(file_data),file_data)  # So you get a string 
    
    fixed = json.loads(file_data)     # decode again
    print(type(fixed),fixed)          # correct now (list)
    

    Output:

    "[\"sbs\", \"sb\", \"bs\", \"v\", \"\"]"
    False ["sbs", "sb", "bs", "v", ""]
    True "[\"sbs\", \"sb\", \"bs\", \"v\", \"\"]"
    <class 'str'> ["sbs", "sb", "bs", "v", ""]
    <class 'list'> ['sbs', 'sb', 'bs', 'v', '']
    

    Or more directly:

    import json
    
    with open('prueba.json') as f:
        data = json.loads(json.load(f))
    print(type(data),data)
    
    # <class 'list'> ['sbs', 'sb', 'bs', 'v', '']
    

How many English words
do you know?
Test your English vocabulary size, and measure
how many words do you know
Online Test
Powered by Examplum