Hello everyone,
After successfully doing this with XML files using the API Connector, this feature is turning out to be much more complicated when using JSON files.
I’m working on an application where the user should be able to import either an XML file (working) or a JSON file (race results), and then immediately view the data inside a Repeating Group — without saving anything into the Bubble database, except maybe the file itself if needed.
My goal
-
The user uploads a JSON file using a File Uploader
-
The file is read/processed (ideally in the simplest way — API Connector or backend workflow)
-
I extract the JSON content as an object
-
I display the structured data in a Repeating Group (laps, drivers, leaderboard, etc.)
In short:
Upload JSON → Parse it → Display it in a Repeating Group.
What I’m trying to understand
I would like to know the best method on Bubble to:
-
Read the contents of an uploaded JSON file
-
Parse that content into a usable format
-
Send it into a Repeating Group
I’ve spent hours going through tutorials but found nothing conclusive.
It’s frustrating because this is very easy to accomplish with XML result files.
Below is a short example of the JSON file structure, including session info, one driver, and all their laps.
{
“data”: {
“sessionType”: “Q”,
“trackName”: “MONZA”,
“sessionIndex”: 0,
“raceWeekendIndex”: 0,
“metaData”: “valencia”,
“serverName”: “SERVEUR NAME”,
“sessionResult”: {
“bestlap”: 101255,
“bestSplits”: [
36835,
38047,
26372
],
“isWetSession”: 0,
“type”: 0,
“leaderBoardLines”: [
{
“car”: {
“carId”: 1001,
“raceNumber”: 8,
“carModel”: 50,
“cupCategory”: 4,
“teamName”: “”,
“nationality”: 0,
“carGuid”: -1,
“teamGuid”: -1,
“drivers”: [
{
“firstName”: “NAME1”,
“lastName”: “LASTNAME2”,
“shortName”: “HOP”,
“playerId”: “SXXXXXXXXXXXXXXX”
}
]
},
“currentDriver”: {
“firstName”: “NAME1”,
“lastName”: “LASTNAME2”,
“shortName”: “HOP”,
“playerId”: “SXXXXXXXXXXXXXXX”
},
“currentDriverIndex”: 0,
“timing”: {
“lastLap”: 101255,
“lastSplits”: [
36835,
38047,
26372
],
“bestLap”: 101255,
“bestSplits”: [
36835,
38047,
26372
],
“totalTime”: 254894771,
“lapCount”: 24,
“lastSplitId”: 0
},
“missingMandatoryPitstop”: -1,
“driverTotalTimes”:
}
]
},
“laps”: [
{ “carId”: 1001, “driverIndex”: 0, “laptime”: 166588, “isValidForBest”: false, “splits”: [100508, 39032, 27047] },
{ “carId”: 1001, “driverIndex”: 0, “laptime”: 103190, “isValidForBest”: true, “splits”: [37832, 38820, 26537] },
{ “carId”: 1001, “driverIndex”: 0, “laptime”: 102770, “isValidForBest”: true, “splits”: [37550, 38460, 26760] },
{ “carId”: 1001, “driverIndex”: 0, “laptime”: 102160, “isValidForBest”: false, “splits”: [37377, 38172, 26610] },
{ “carId”: 1001, “driverIndex”: 0, “laptime”: 102487, “isValidForBest”: true, “splits”: [37512, 38242, 26732] },
{ “carId”: 1001, “driverIndex”: 0, “laptime”: 106090, “isValidForBest”: false, “splits”: [36880, 42122, 27087] },
{ “carId”: 1001, “driverIndex”: 0, “laptime”: 101255, “isValidForBest”: true, “splits”: [36835, 38047, 26372] }
],
“penalties”: ,
“post_race_penalties”: ,
“ACCtrackerSessionConfiguration”: {
“confirmedResult”: true,
“adminOnlyPreview”: false
}
}
}
![]()










