DEV Community

Nima Akbarzadeh
Nima Akbarzadeh

Posted on • Edited on

Parsing ChatGPT JSON stream response - Partial and incomplete JSON parser python library OpenAI

In today's world of APIs and microservices, working with streaming JSON responses is common. To simplify this, I've created a handy open-source library to easily handle OpenAI's streaming APIs. While tailored to OpenAI and ChatGPT, this versatile library can parse streaming JSON from any API.

This post will introduce you to my new open-source library and why it's useful for consuming OpenAI's streaming APIs. I'll also give a quick overview of how it works under the hood. Whether you're building an app with OpenAI or working with other streaming JSON APIs, read on to see how this library can save you time and effort.

The core benefit is the easy handling of sizable JSON responses, even as they stream in. No need to deal with the complexity - the library takes care of that. It also works for any API returning streaming JSON, not just OpenAI's. I'll share examples of both so you can see just how much it simplifies things.

Image description

Let's get started! First, I'll give a quick primer on OpenAI and streaming JSON for context. Then we'll dive into the library itself and see some code examples.

Here is an additional section expanding on the challenges of streaming JSON responses:

The Problem with Streaming JSON

Streaming text responses is straightforward - you can display each character or token to the user as it streams in. But JSON poses some unique headaches.

JSON responses are structured as nested objects and arrays. A streaming JSON response is essentially malformed until the full response is completed. For example, halfway through a response, you may see something like:

[{"age": "18

This isn't valid JSON yet! So if you try to parse it with JSON.parse(), it will fail.

You face a tradeoff - either:

✅ Wait for the full JSON response to complete before parsing/displaying it. But this negates the benefits of streaming for your users.

or

💥 Try parsing the incomplete streaming JSON, and get errors.
What we really want is a way to incrementally build and parse the streaming JSON in real-time as it comes in. Displaying it to the user with minimal lag, without running into errors.
This is exactly what my library enables! Keep reading to see how it works…

The Solution

Image description

My library provides a simple yet powerful solution. Install it via:

pip install partialjson

Then import the JSONParser class:

from partialjson.json_parser import JSONParser

Instantiate the parser, and pass any incomplete JSON string to the parse() method. For example:

parser = JSONParser()
incomplete_json = '{"name": "John", "age": 18, "family":'
print(parser.parse(incomplete_json))

Here's the magic - despite the JSON being incomplete, parse() incrementally parses what it has received so far into valid JSON objects.

So at each moment, you can work with the fully structured JSON consisting of only the data received up until that point. No more errors or waiting for the full response!

As more streaming data comes in, the parser seamlessly incorporates it into the existing JSON structure. This enables you to display the information to users with minimal lag. Just what we want.

So in a nutshell, it empowers real-time processing and display of streaming JSON responses. Solving the problem elegantly via incremental parsing. 

This library is open source and the source is available on my GitHub.

Top comments (0)