# No, Your Device Doesn't Have to Send JSON

> A common Serial Studio misconception: because the project file is JSON, the device must send JSON. It doesn't. Send CSV, binary, or anything a parser reads.
>
> Under the Hood · June 5, 2026 · by Alex Spataru · https://serial-studio.com/blog/json-misconception

Here is one of the most common misunderstandings about Serial Studio, and it has tripped up a lot of people over the years. Somebody sees the Project Editor described as editing "JSON project files," or notices the project saves as a `.ssproj` (which is JSON), and concludes that their microcontroller has to output JSON. Then they go write a JSON serializer on an 8-bit micro, watch it eat their flash and their loop time, and wonder why such a simple task got so hard.

It didn't have to. Your device does not have to send JSON. It never did.

## Two different files, two different jobs

The confusion comes from mixing up two separate things that both happen to involve the word "format."

- **The project file** (`.ssproj`) lives on your computer. It is a JSON document, and it describes the *dashboard*: the groups, datasets, widgets, alarms, and layout. It is configuration, written and read by Serial Studio, not by your device. Think of it as the blueprint.
- **The wire format** is whatever your device actually sends down the cable or the socket. That is entirely up to you.

These two never have to match. The JSON in the project file is the host's description of what to draw. It says nothing about how your bytes arrive.

## What your device can actually send

The bridge between the two is the frame parser, which takes each incoming frame and turns it into the array of values your datasets expect. Because of that, the wire format can be almost anything:

- **Plain comma-separated numbers.** The simplest option, and the one Quick Plot reads with no project file at all.
- **Binary packets.** Fixed-layout structs, with a `DataView` or Lua `string.unpack` pulling out the fields.
- **Delimited text** with any separator, via a built-in template and no code.
- **Established formats** like MAVLink, NMEA, MessagePack, TLV, COBS, or SLIP, which the built-in templates already cover.
- **JSON, if you genuinely want to.** It is allowed, it is just never required.

The one-line proof is Quick Plot. Print this from an Arduino:

```cpp
Serial.println("24.7,61,3.9");
```

Connect, pick Quick Plot, and you get three live plots. There is no project file, and there is not a single byte of JSON anywhere near your device.

## The mental model

Keep the two roles separate and it stops being confusing:

- The `.ssproj` file is JSON because it is a **host-side blueprint** for the dashboard.
- Your device just sends **values**, in whatever format is cheapest for it.
- The **frame parser** maps the wire format onto the datasets the blueprint defines.

So when you build a project, you are describing what you want to see, not dictating what your firmware must speak. Send the simplest thing your device can produce. If that is a line of comma-separated numbers, you are already done. [Operation Modes](https://serial-studio.com/help/operation-modes) covers Quick Plot versus Project File, and [How Serial Studio Turns Bytes Into Datasets](https://serial-studio.com/blog/frame-parsers-and-the-empty-parser) explains where the parsing fits.
