jsog

WebJar for jsog

License

License

MIT
GroupId

GroupId

org.webjars.npm
ArtifactId

ArtifactId

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 jsog

How to add to project

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