jsog

WebJar for jsog

License

License

MIT
Categories

Categories

Github Development Tools Version Controls
GroupId

GroupId

org.webjars.npm
ArtifactId

ArtifactId

github-com-jsog-jsog
Last Version

Last Version

1.0.7
Release Date

Release Date

Type

Type

jar
Description

Description

jsog
WebJar for jsog
Project URL

Project URL

http://webjars.org
Source Code Management

Source Code Management

https://github.com/jsog/jsog

Download github-com-jsog-jsog

How to add to project

<!-- https://jarcasting.com/artifacts/org.webjars.npm/github-com-jsog-jsog/ -->
<dependency>
    <groupId>org.webjars.npm</groupId>
    <artifactId>github-com-jsog-jsog</artifactId>
    <version>1.0.7</version>
</dependency>
// https://jarcasting.com/artifacts/org.webjars.npm/github-com-jsog-jsog/
implementation 'org.webjars.npm:github-com-jsog-jsog:1.0.7'
// https://jarcasting.com/artifacts/org.webjars.npm/github-com-jsog-jsog/
implementation ("org.webjars.npm:github-com-jsog-jsog:1.0.7")
'org.webjars.npm:github-com-jsog-jsog:jar:1.0.7'
<dependency org="org.webjars.npm" name="github-com-jsog-jsog" rev="1.0.7">
  <artifact name="github-com-jsog-jsog" type="jar" />
</dependency>
@Grapes(
@Grab(group='org.webjars.npm', module='github-com-jsog-jsog', version='1.0.7')
)
libraryDependencies += "org.webjars.npm" % "github-com-jsog-jsog" % "1.0.7"
[org.webjars.npm/github-com-jsog-jsog "1.0.7"]

Dependencies

There are no dependencies for this project. It is a standalone project that does not depend on any other jars.

Project Modules

There are no modules declared in this project.

Build Status npm version npm dependencies devDependency Status Gitter

JSOG - JavaScript Object Graph

JSOG (JavaScript Object Graph) is a simple convention which allows arbitrary object graphs to be represented in JSON. It allows a large, complicated, cyclic object graph to be serialized and deserialized to and from JSON.

The problem with JSON

JSON is widely used as a data interchange format, however, it is limited:

  • Only directed acyclic graphs can be represented.
  • Graphs with repeating information are duplicated on the wire and in memory.

For example:

[
	{
		"name": "Sally",
		"secretSanta": {...Bob...}
	},
	{
		"name": "Bob",
		"secretSanta": {...Fred...}
	},
	{
		"name": "Fred",
		"secretSanta": {...Sally...}
	}
]

This graph has cycles. Your database can represent these relationships just fine and your ORM can pull the object graph (with references) into memory, but you cannot directly serialize to a JSON structure without stack overflow errors.

The JSOG solution

JSOG is a standard way to represent object graphs.

  • JSOG is 100% JSON. No special parser is necessary.
  • JSOG is human readable; graphs without cycles look like regular JSON.
  • JSOG does not require (or interact with) pre-existing id fields.
  • JSOG is fully self-describing; ids and refs are unambiguous.
  • JSOG is easy to implement in any language or platform.

This is the JSOG representation of the aforementioned graph:

[
	{
		"@id": "1",
		"name": "Sally",
		"secretSanta": {
			"@id": "2",
			"name": "Bob",
			"secretSanta": {
				"@id": "3",
				"name": "Fred",
				"secretSanta": { "@ref": "1" }
			}
		}
	},
	{ "@ref": "2" },
	{ "@ref": "3" }
]
  • @id values are arbitrary strings.
  • @id definitions must come before @ref references.

Serializing to JSOG

Each time a new object is encountered, give it a unique string @id. Each time a repeated object is encountered, serialize as a @ref to the existing @id.

Deserializing from JSOG

Track the @id of every object deserialized. When a @ref is encountered, replace it with the object referenced.

Implementation

JSOG is designed to be easily implemented across platforms. Look at the existing implementations; most are a couple dozen lines of code.

JavaScript

The github project which contains this README includes a JavaScript implementation of JSOG. It can be used to convert between a cyclic object graph and JSOG strings:

string = JSOG.stringify(cyclicGraph);
cyclicGraph = JSOG.parse(string);

Or it can be used to convert between object graphs directly:

jsogStructure = JSOG.encode(cyclicGraph);	// has { '@ref': 'ID' } links instead of cycles
cyclicGraph = JSOG.decode(jsogStructure);

Other Languages

Please contact us about other implementations so they can be linked here.

Authors

The authors are:

License

This specification and software are provided under the MIT license

Versions

Version
1.0.7