caprison

CapriSON is an object notation standard which pulls together parts of JSON, Protobufs, Flatpak, and CSVs.

Usage no npm install needed!

<script type="module">
  import caprison from 'https://cdn.skypack.dev/caprison';
</script>

README

CapriSON

CapriSON is an object notation standard which pulls together parts of JSON, Protobufs, Flatpak, and CSVs. This standard minimizes bytes over the wire by using a template (stored in your app, similar to a proto) for each object type while still transmitting the data as human-readable text.

// JSON Serialization (140b gzip'd)
const myJsonData = {
  "position": '100x200',
  "angle": 23,
  "label": "Account",
  "dimensions": {
    "radius": 23,
  },
  "children": [
    { "name": 'freddy', "age": 19 },
    { "name": 'scooby', "age": 72 },
    { "name": 'shaggy', "age": 11 },
  ],
}

// CapriSON Serialization (72b gzip'd)
const myCapriSONData = "23,3,19,freddy,72,scooby,11,shaggy,23,circle,100x200"

How it works

Before deploying your app, use CapriSON.templatify to transform any JSON payload into a template. This template is then used to parse any data sent from the server.

// Creating the template (Performed in your build step)
const template = CapriSON.templatify(myJsonData);
expect(template).to.deep.equal({
  position: 'string',
  angle: 'number',
  label: 'string',
  diameter: {
    radius: 'number',
  },
  children: [
    {
      name: 'string',
      age: 'number',
    },
  ],
});

This template (or any other) is then passed to CapriSON.parse during runtime.

// Using the template (Performed at runtime)
const result = CapriSON.parse(template, myCapriSONData)
expect(result).to.deep.equal(myJsonData);

At this point your original data with all hierarchy and ordering retained.

Pros vs Cons

Pros

  • Relatively efficient data packing
  • Human-readable / debuggable
  • Typescript support
  • Potential for schema checking / enforcement
  • Potential for constant-time value look-ups

Cons

  • Arrays must have children with the same keys
  • Not as efficient as Flatpak or Protobufs (it's still text!)