Update: I wrote a solution that does not require reading the entire file in one go. It is too big for a stackoverflow answer, but can be found here jsonstream.

You can use json.JSONDecoder.raw_decode to decode arbitarily big strings of "stacked" JSON (so long as they can fit in memory). raw_decode stops once it has a valid object and returns the last position where was not part of the parsed object. It is poorly documented [1] (see footer), but you can pass this position back to raw_decode and it start parsing again from that position. Unfortunately, the Python json module doesn ot accept strings that have prefixing whitespace. So we need to search to find the first non-whitespace part of your document.

from json import JSONDecoder, JSONDecodeError
import re

NOT_WHITESPACE = re.compile(r'\S')

def decode_stacked(document, idx=0, decoder=JSONDecoder()):
    while True:
        match = NOT_WHITESPACE.search(document, idx)
        if not match:
            return
        idx = match.start()
        
        try:
            obj, idx = decoder.raw_decode(document, idx)
        except JSONDecodeError:
            # do something sensible if there's some error
            raise
        yield obj

s = """

{"a": 1}  


   [
1
,   
2
]


"""

for obj in decode_stacked(s):
    print(obj)

prints:

{'a': 1}
[1, 2]

Note About Missing Documentation

The current signature of raw_decode() dates from 2009, when simplejson was ported into the standard library. The documentation for raw_decode() in simplejson mentions an optional idx argument that can be used to start parsing at an offset. Given that the signature of raw_decode() has not changed since 2009, I think it is fair to assume the API is fairly stable. Especially as decode() uses the idx argument of raw_decode() to ignore prefixing whitespace when parsing a string. And this is exactly what this answer is using the idx argument for too. The documentation of raw_decode() in simplejson is:

raw_decode(s[, idx=0])

Decode a JSON document from s (a str or unicode beginning with a JSON document) starting from the index idx and return a 2-tuple of the Python representation and the index in s where the document ended.

This can be used to decode a JSON document from a string that may have extraneous data at the end, or to decode a string that has a series of JSON objects.

JSONDecodeError will be raised if the given JSON document is not valid.

Answer from Dunes on Stack Overflow
🌐
Google Groups
groups.google.com › g › json-c › c › YyCp43o6RPU
getting multiple json objects from one file
November 27, 2018 - I apologize for the multiple posts. This is the code I'm experimenting with. There are 3 objects in the file. The values from only one object are being printed: #include <stdio.h> #include <json.h> #include <stdlib.h> #define BUF_SIZE 2048 enum json_tokener_error jerr; int main (int argc, char *argv[]) { FILE *fp = fopen ("units.json", "r"); if (fp == NULL) { fprintf (stderr, "Unable to open file."); exit (EXIT_FAILURE); } fseek (fp, 0, SEEK_END); int f_size = ftell (fp); rewind (fp); char buffer[BUF_SIZE]; size_t result = fread (buffer, 1, f_size, fp); printf ("%s", buffer); json_tokener *tok
Top answer
1 of 6
99

Update: I wrote a solution that does not require reading the entire file in one go. It is too big for a stackoverflow answer, but can be found here jsonstream.

You can use json.JSONDecoder.raw_decode to decode arbitarily big strings of "stacked" JSON (so long as they can fit in memory). raw_decode stops once it has a valid object and returns the last position where was not part of the parsed object. It is poorly documented [1] (see footer), but you can pass this position back to raw_decode and it start parsing again from that position. Unfortunately, the Python json module doesn ot accept strings that have prefixing whitespace. So we need to search to find the first non-whitespace part of your document.

from json import JSONDecoder, JSONDecodeError
import re

NOT_WHITESPACE = re.compile(r'\S')

def decode_stacked(document, idx=0, decoder=JSONDecoder()):
    while True:
        match = NOT_WHITESPACE.search(document, idx)
        if not match:
            return
        idx = match.start()
        
        try:
            obj, idx = decoder.raw_decode(document, idx)
        except JSONDecodeError:
            # do something sensible if there's some error
            raise
        yield obj

s = """

{"a": 1}  


   [
1
,   
2
]


"""

for obj in decode_stacked(s):
    print(obj)

prints:

{'a': 1}
[1, 2]

Note About Missing Documentation

The current signature of raw_decode() dates from 2009, when simplejson was ported into the standard library. The documentation for raw_decode() in simplejson mentions an optional idx argument that can be used to start parsing at an offset. Given that the signature of raw_decode() has not changed since 2009, I think it is fair to assume the API is fairly stable. Especially as decode() uses the idx argument of raw_decode() to ignore prefixing whitespace when parsing a string. And this is exactly what this answer is using the idx argument for too. The documentation of raw_decode() in simplejson is:

raw_decode(s[, idx=0])

Decode a JSON document from s (a str or unicode beginning with a JSON document) starting from the index idx and return a 2-tuple of the Python representation and the index in s where the document ended.

This can be used to decode a JSON document from a string that may have extraneous data at the end, or to decode a string that has a series of JSON objects.

JSONDecodeError will be raised if the given JSON document is not valid.

2 of 6
38

Use a json array, in the format:

[
{"ID":"12345","Timestamp":"20140101", "Usefulness":"Yes",
  "Code":[{"event1":"A","result":"1"},…]},
{"ID":"1A35B","Timestamp":"20140102", "Usefulness":"No",
  "Code":[{"event1":"B","result":"1"},…]},
{"ID":"AA356","Timestamp":"20140103", "Usefulness":"No",
  "Code":[{"event1":"B","result":"0"},…]},
...
]

Then import it into your python code

import json

with open('file.json') as json_file:

    data = json.load(json_file)

Now the content of data is an array with dictionaries representing each of the elements.

You can access it easily, i.e:

data[0]["ID"]
Discussions

Writing multiple json items to files
Hello i try to write json items to separate files pairs. I generate json items and files names and want to write the to files. I suceeded writing only one file pair. How can write more than one pair of files. I would be pleased help how can achive write multiple file pairs to disk. More on community.n8n.io
🌐 community.n8n.io
1
0
September 6, 2021
Multiple objects in JSON file
You’re not getting valid JSON if there’s more than one top level object. More on reddit.com
🌐 r/learnpython
7
February 5, 2020
Parse JSON File with Array of Objects without converting to USTRUCT
Hello, I have multiple JSON files as follows. I am trying to create an all-purpose plugin to handle some JSON object-array files given to me. // Multiple files like this: [ { // JSON Object }, { // JSON Object } ] I have seen discussion threads such as Parsing json array of objects suggesting ... More on forums.unrealengine.com
🌐 forums.unrealengine.com
0
0
September 18, 2022
Parsing multiple JSON objects from a string or stream
(It would help somewhat if json could accept whitespace* separated objects in arrays not requiring comma, though that would not be valid JSON. This could be a relaxed parsing, instead of strict.) Second possible implementation (preferred IMHO) for the parsing to be resumable. Meaning extract one ... More on github.com
🌐 github.com
3
January 28, 2017
🌐
Reddit
reddit.com › r/learnpython › multiple objects in json file
r/learnpython on Reddit: Multiple objects in JSON file
February 5, 2020 -

Hey, i am new to programming and I am trying to decode thousands of JSON files.
Usually there is one object in each JSON file, but for some reason a lot of my files have multiple JSON objects. Some have up to 5 objects.

{
	"testNumber": "test200",
	"device": {
		"deviceID": 4000008

	},
	"user": {
		"userID": "4121412"
	}
}
{
	"testNumber": "test201",
	"device": {
		"deviceID": 4000009

	},
	"user": {
		"userID": "4121232"
	}
}

My code gives me the error: json.decoder.JSONDecodeError: Extra data: line 2 column 1
Because of that I am using except ValueError but I would like to get the data out of these JSON files.

import json
import os

test_dir = r'C:\Users\path\path'
for file in os.listdir(test_dir):
    if 'testNumber' in file:
        try: 
            data = json.load(open(test_dir + '\\' + file, 'r'))  
            print("valid")
        except ValueError: 
               print("Decoding JSON has failed")

Since json.loads and json.load don't work: is there any other way open the JSON file so that I can try to split the content in 2 objects?

🌐
Quora
quora.com › Can-JSON-contain-multiple-objects
Can JSON contain multiple objects? - Quora
The file is invalid if it contains more than one JSON object. When you try to load and parse a JSON file with multiple JSON objects, each line contains valid JSON, but as a whole, it is not a valid JSON as there is no top-level list or object ...
Find elsewhere
🌐
Unreal Engine
forums.unrealengine.com › development › programming & scripting › c++
Parse JSON File with Array of Objects without converting to USTRUCT - C++ - Epic Developer Community Forums
September 18, 2022 - Hello, I have multiple JSON files as follows. I am trying to create an all-purpose plugin to handle some JSON object-array files given to me. // Multiple files like this: [ { // JSON Object }, { …
🌐
GitHub
github.com › nlohmann › json › issues › 438
Parsing multiple JSON objects from a string or stream · Issue #438 · nlohmann/json
January 28, 2017 - Hi, I just started using your library, so far I like your design, but I run into this problem. ... {"data":[164,227,155,136],"dir":"rx"}{"data":[249,88,104,174],"dir":"rx"}{"data":[148,105,74,58],"dir":"rx"} ... string smsg((char*)buff, len); if (debuglevel_&1) cout << "Raw data Str: " << smsg << endl; json jmsg = json::parse(smsg); ... Expected result: I would like to be able to parse multiple concatenated JSON strings. A possible implementation could be if the result were an array of json objects.
Author   szikra
Top answer
1 of 3
6

I think the problem is that you are overwriting the file with fs.writeFileSync().

You should use fs.appendFileSync() to add new data to the end of the file. See the node docs.

https://nodejs.org/api/fs.html#fs_fs_appendfilesync_file_data_options

2 of 3
2

if you are writing all data at once, then you need to do create an array, push all objects to array and write the array to file

function insertDatasJson (res) {
    let fs = require('fs');
    let base = require('../public/json/template.json');
    let result = [];
    for (/*you loop statmeent*/) {
      let obj = JSON.parse(JSON.stringify(base));  // or your preferred way of deep copying
      obj.Subject = 'f';
      obj.Body.Content = 'e';
      obj.Start.DateTime = '2016-11-13T08:30:00';
      obj.End.DateTime = '2016-11-13T17:30:00';
      result.push(obj);
    }

    fs.writeFileSync('./public/json/output/jsonOutput.json', JSON.stringify(result, null, 4));
}

Or if you want to write data in multiple runs, then

function insertDatasJson (res) {
    let fs = require('fs');
    let base = require('../public/json/template.json');
    let data = require('./public/json/output/jsonOutput.json');
    base.Subject = 'f';
    base.Body.Content = 'e';
    base.Start.DateTime = '2016-11-13T08:30:00';
    base.End.DateTime = '2016-11-13T17:30:00';
    data.push(base);
    fs.writeFileSync('./public/json/output/jsonOutput.json', JSON.stringify(data, null, 4));
}

However, in second case, you need to add some code to handle the case of first run when there is no existing data in the output file, or file doesn't exist. Another way to handle that condition would be to initialize the output file with empty JSON array

[]

EDIT: In both cases, appending to the existing file will not work as it will generate invalid JSON.

🌐
Reddit
reddit.com › r/sqlserver › reading multiple json objects from a single file
r/SQLServer on Reddit: Reading multiple json objects from a single file
January 10, 2023 -

Hey all, I’ve got an annoying situation. We have a system, that we don’t control, that outputs JSON to a single file where each row of the file is a json object. All of these objects are not wrapped in a larger JSON array. That piece is important. Each row has all the same keys, just different values per key.

We need to import all of these objects into SQL server mapping the keys to columns. We got it working for the most part by following: https://www.sqlshack.com/import-json-data-into-sql-server/

Declare @JSON varchar(max) SELECT @JSON=BulkColumn FROM OPENROWSET (BULK 'C:\sqlshack\Results.JSON', SINGLE_CLOB) import SELECT * FROM OPENJSON (@JSON) WITH ( [FirstName] varchar(20), [MiddleName] varchar(20), [LastName] varchar(20), [JobTitle] varchar(20), [PhoneNumber] nvarchar(20), [PhoneNumberType] varchar(10), [EmailAddress] nvarchar(100), [EmailPromotion] bit

)

That works but it only reads the first object it finds. Is there anyway to tell SQL Server “loop over all the lines of this file and import them off?”

Ideally the other system would wrap all the lines in a valid JSON array but they don’t and we can’t make them.

Warning: im a SQL server noob, so this may be very simple but I can’t find anything about this online

Edit: I haven’t tried it yet but this might be the answer just in case someone else comes across this post in the far off future.

https://learn.microsoft.com/en-us/archive/blogs/sqlserverstorageengine/loading-line-delimited-json-files-in-sql-server-2016

Basically you have to hand a SQL server format file.

🌐
Stack Overflow
stackoverflow.com › questions › 61118408 › how-to-transform-several-json-objects-using-json-c
How to transform several JSON objects using json-c? - Stack Overflow
json_object *jobj = NULL; const char *mystring = NULL; int stringlen = 0; enum json_tokener_error jerr; do { mystring = ... // get JSON string, e.g. read from file, etc...
🌐
Medium
ekapramudita.medium.com › combining-multiple-json-files-into-a-single-json-file-8d6e608483e0
Combining Multiple JSON Files Into A Single JSON File | by Eka Aditya Pramudita | Medium
June 7, 2021 - This is the form of a movie JSON file in the folder. We can see that it is just a line of a dictionary, showing one movie data. Some of the fields are relevant for data analysis, some of them are not. We want to combine all movie observations into a single JSON file by picking necessary fields of a movie then put that in one line, then for the next movie we put that in the next line and so on.
🌐
Make Community
community.make.com › questions
Combine two JSON objects into one - Questions - Make Community
September 18, 2024 - Hi everyone! I’m actualy tring to append one JSON object to another to create one JSON file containing the two previous JSON objects, one after another Context: I’m creating a JSON object from Google Sheet data, and…
🌐
Qlik Community
community.qlik.com › t5 › Design-and-Development › How-to-read-multiple-json-objects-which-is-not-an-json-array-in › td-p › 2363169
How to read multiple json objects which is not an json array in talend
November 15, 2024 - Hi All , iam new to talend try to learn things any help would be much appreciated Iam trying to read multiple json objects present in single file in to a table by dividing the values through textractJsonfield component My current job is picking only first json value and writing the same to dat...
Top answer
1 of 3
3

That doesn't look much like json, but yes, you can totally have an array of objects in json file. Something like this in your case:

[{"firstName": "John", "lastName": "Smith"},       
{"firstName": "Jane", "lastName": "Doe"}]

A json file may either contain a single object in (which can be complex, with many nested keys) or an array of such objects. It's either curly braces or square brackets on the outside.

2 of 3
0

A json file needs to have a top - this can either be a json object enclosed in {} or a json array enclosed in []

A json file can have as many objects as you like as long as they are enclosed in a top (although the word "top" is not explicitly used)

{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"}

You can enclose the above using a top object {} like this -

{  
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"}
}

EDIT - The above is incorrect. Let me revise this answer.
1. The JSON file can have multiple objects as an array of objects.
2. You can't list multiple objects inside an object as shown above in the first example, as each object must have entries that are key/value pairs. In the above case the top object doesn't have key/value pairs but just a list of objects which is syntactically incorrect.

This means that the best way to have multiple objects is to create an array of multiple objects like this :

[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"}
]

Here is a link to the ECMA-404 standard that defines json.

🌐
DEV Community
dev.to › vinodgarg › multiple-json-objects-in-a-single-file-kdb
Multiple Json objects in a single file - DEV Community
May 7, 2019 - we have multiple json objects stored in array format in a file (30K records per file). I am looking for java code which can be used to split json objects into multiple objects and provide the json object in variable. Also, Is there any way which can be used to read array element one by one instead ...