Home > Enterprise >  Parsing errors when writing to a json file from python
Parsing errors when writing to a json file from python

Time:03-29

I have seen similar questions yet not sure what do I need to change in my case to make it a valid json. I have a list of dictionaries like this:

dicts = [{'date': '2018-12-11',
  'target_currency': 'DKK',
  'exchange_rate': 7.4641,
  'base_currency': 'EUR'},
 {'date': '2018-12-11',
  'target_currency': 'GBP',
  'exchange_rate': 0.90228,
  'base_currency': 'EUR'},
...]

which I have converted to .json like this:

        with open('cleaned.json', 'w') as f:
            for d in dict2:
                json.dump(d, f)
                f.write(',') 

to get this error on https://jsonlint.com/.

{
    "date": "2018-12-11",
    "target_currency": "USD",
    "exchange_rate": 1.1379,
    "base_currency": "EUR"
}, {
    "date": "2018-12-11",
    "target_currency": "JPY",
    "exchange_rate": 128.75,
    "base_currency": "EUR"
}, {
    "date": "2018-12-11",
    "target_currency": "BGN",
    "exchange_rate": 1.9558,
    "base_currency": "EUR"



Error: Parse error on line 6:
...e_currency": "EUR"}, {   "date": "2018-1
----------------------^
Expecting 'EOF', got ','

When I tried to change comma for a new line separator, f.write('\n'), I got this error:

Error: Parse error on line 6:
..._currency": "EUR"} { "date": "2018-12-
----------------------^
Expecting 'EOF', '}', ',', ']', got '{'

Apparently I am writing into a file incorrectly. What am I doing wrong?

I have also tried writing it into a .jsonl (json lines) format with with open('cleaned.jsonl', 'w') and f.write('\n'). yet I still have

JSONDecodeError: Extra data: line 2 column 1 (char 98)

when I load it again using json.load().

CodePudding user response:

import json

data = [{'date': '2018-12-11',
  'target_currency': 'DKK',
  'exchange_rate': 7.4641,
  'base_currency': 'EUR'},
 {'date': '2018-12-11',
  'target_currency': 'GBP',
  'exchange_rate': 0.90228,
  'base_currency': 'EUR'}]

with open('data.json', 'w') as f:
    json.dump(data, f, indent=4)


with open('data.jsonl', 'w') as f:
    for item in data:
        f.write(json.dumps(item)   '\n')

output data.json:

[
    {
        "date": "2018-12-11",
        "target_currency": "DKK",
        "exchange_rate": 7.4641,
        "base_currency": "EUR"
    },
    {
        "date": "2018-12-11",
        "target_currency": "GBP",
        "exchange_rate": 0.90228,
        "base_currency": "EUR"
    }
]

This you can read as a whole with json.load().

output data.jsonl:

{"date": "2018-12-11", "target_currency": "DKK", "exchange_rate": 7.4641, "base_currency": "EUR"}
{"date": "2018-12-11", "target_currency": "GBP", "exchange_rate": 0.90228, "base_currency": "EUR"}

Note that ndjson/jsonl you cannot read with json module as one file, you need to read/parse line by line. There are third party libraries to handle ndjson/jsonl conveniently. Also, you cannot validate ndjson/jsonl on https://jsonlint.com

  • Related