gojsondiff

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 20, 2017 License: MIT Imports: 9 Imported by: 329

README

Go JSON Diff (and Patch)

Wercker GoDoc MIT License

How to use

Installation
go get github.com/yudai/gojsondiff
Comparing two JSON strings

See jd/main.go for how to use this library.

CLI tool

This repository contains a package that you can use as a CLI tool.

Installation
go get github.com/yudai/gojsondiff/jd
Usage
Diff

Just give two json files to the jd command:

jd one.json another.json

Outputs would be something like:

 {
   "arr": [
     0: "arr0",
     1: 21,
     2: {
       "num": 1,
-      "str": "pek3f"
+      "str": "changed"
     },
     3: [
       0: 0,
-      1: "1"
+      1: "changed"
     ]
   ],
   "bool": true,
   "num_float": 39.39,
   "num_int": 13,
   "obj": {
     "arr": [
       0: 17,
       1: "str",
       2: {
-        "str": "eafeb"
+        "str": "changed"
       }
     ],
+    "new": "added",
-    "num": 19,
     "obj": {
-      "num": 14,
+      "num": 9999
-      "str": "efj3"
+      "str": "changed"
     },
     "str": "bcded"
   },
   "str": "abcde"
 }

When you prefer the delta foramt of jsondiffpatch, add the -f delta option.

jd -f delta one.json another.json

This command shows:

{
  "arr": {
    "2": {
      "str": [
        "pek3f",
        "changed"
      ]
    },
    "3": {
      "1": [
        "1",
        "changed"
      ],
      "_t": "a"
    },
    "_t": "a"
  },
  "obj": {
    "arr": {
      "2": {
        "str": [
          "eafeb",
          "changed"
        ]
      },
      "_t": "a"
    },
    "new": [
      "added"
    ],
    "num": [
      19,
      0,
      0
    ],
    "obj": {
      "num": [
        14,
        9999
      ],
      "str": [
        "efj3",
        "changed"
      ]
    }
  }
}
Patch

Give a diff file in the delta format and the JSON file to the jp command.

jp diff.delta one.json

License

MIT License (see LICENSE for detail)

Documentation

Overview

Package gojsondiff implements "Diff" that compares two JSON objects and generates Deltas that describes differences between them. The package also provides "Patch" that apply Deltas to a JSON object.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Added

type Added struct {

	// Values holds the added value
	Value interface{}
	// contains filtered or unexported fields
}

An Added represents a new added field of an object or an array

func NewAdded

func NewAdded(position Position, value interface{}) *Added

NewAdded returns a new Added

func (*Added) PostApply

func (d *Added) PostApply(object interface{}) interface{}

func (Added) PostPosition

func (i Added) PostPosition() Position

func (Added) Similarity

func (cache Added) Similarity() (similarity float64)

type Array

type Array struct {

	// Deltas holds internal Deltas
	Deltas []Delta
	// contains filtered or unexported fields
}

An Array is a Delta that represents an array of JSON

func NewArray

func NewArray(position Position, deltas []Delta) *Array

NewArray returns an Array

func (*Array) PostApply

func (d *Array) PostApply(object interface{}) interface{}

func (Array) PostPosition

func (i Array) PostPosition() Position

func (Array) Similarity

func (cache Array) Similarity() (similarity float64)

type Deleted

type Deleted struct {

	// The value deleted
	Value interface{}
	// contains filtered or unexported fields
}

A Delted represents deleted field or index of an Object or an Array.

func NewDeleted

func NewDeleted(position Position, value interface{}) *Deleted

NewDeleted returns a Deleted

func (*Deleted) PreApply

func (d *Deleted) PreApply(object interface{}) interface{}

func (Deleted) PrePosition

func (i Deleted) PrePosition() Position

func (Deleted) Similarity

func (d Deleted) Similarity() (similarity float64)

type Delta

type Delta interface {
	// Similarity calculates the similarity of the Delta values.
	// The return value is normalized from 0 to 1,
	// 0 is completely different and 1 is they are same
	Similarity() (similarity float64)
}

A Delta represents an atomic difference between two JSON objects.

type Diff

type Diff interface {
	// Deltas returns Deltas that describe differences between two JSON objects
	Deltas() []Delta
	// Modified returnes true if Diff has at least one Delta.
	Modified() bool
}

A Diff holds deltas generated by a Differ

type Differ

type Differ struct {
	// contains filtered or unexported fields
}

A Differ conmapres JSON objects and apply patches

func New

func New() *Differ

New returns new Differ with default configuration

func (*Differ) ApplyPatch

func (differ *Differ) ApplyPatch(json map[string]interface{}, patch Diff)

ApplyPatch applies a Diff to an JSON object. This method is destructive.

func (*Differ) Compare

func (differ *Differ) Compare(
	left []byte,
	right []byte,
) (Diff, error)

Compare compares two JSON strings as []bytes and return a Diff object.

func (*Differ) CompareArrays

func (differ *Differ) CompareArrays(
	left []interface{},
	right []interface{},
) Diff

CompareArrays compares two JSON arrays as []interface{} and return a Diff object.

func (*Differ) CompareObjects

func (differ *Differ) CompareObjects(
	left map[string]interface{},
	right map[string]interface{},
) Diff

CompareObjects compares two JSON object as map[string]interface{} and return a Diff object.

type Index

type Index int

A Index is a Position with an int value, which means the Delta is in an Array.

func (Index) CompareTo

func (i Index) CompareTo(another Position) bool

func (Index) String

func (i Index) String() (name string)

type Modified

type Modified struct {

	// The value before modification
	OldValue interface{}

	// The value after modification
	NewValue interface{}
	// contains filtered or unexported fields
}

A Modified represents a field whose value is changed.

func NewModified

func NewModified(position Position, oldValue, newValue interface{}) *Modified

NewModified returns a Modified

func (*Modified) PostApply

func (d *Modified) PostApply(object interface{}) interface{}

func (Modified) PostPosition

func (i Modified) PostPosition() Position

func (Modified) Similarity

func (cache Modified) Similarity() (similarity float64)

type Moved

type Moved struct {

	// The value before moving
	Value interface{}
	// The delta applied after moving (for compatibility)
	Delta interface{}
	// contains filtered or unexported fields
}

A Moved represents field that is moved, which means the index or name is changed. Note that, in this library, assigning a Moved and a Modified to a single position is not allowed. For the compatibility with jsondiffpatch, the Moved in this library can hold the old and new value in it.

func NewMoved

func NewMoved(oldPosition Position, newPosition Position, value interface{}, delta Delta) *Moved

func (*Moved) PostApply

func (d *Moved) PostApply(object interface{}) interface{}

func (Moved) PostPosition

func (i Moved) PostPosition() Position

func (*Moved) PreApply

func (d *Moved) PreApply(object interface{}) interface{}

func (Moved) PrePosition

func (i Moved) PrePosition() Position

func (Moved) Similarity

func (cache Moved) Similarity() (similarity float64)

type Name

type Name string

A Name is a Postition with a string, which means the delta is in an object.

func (Name) CompareTo

func (n Name) CompareTo(another Position) bool

func (Name) String

func (n Name) String() (name string)

type Object

type Object struct {

	// Deltas holds internal Deltas
	Deltas []Delta
	// contains filtered or unexported fields
}

An Object is a Delta that represents an object of JSON

func NewObject

func NewObject(position Position, deltas []Delta) *Object

NewObject returns an Object

func (*Object) PostApply

func (d *Object) PostApply(object interface{}) interface{}

func (Object) PostPosition

func (i Object) PostPosition() Position

func (Object) Similarity

func (cache Object) Similarity() (similarity float64)

type Position

type Position interface {
	// String returns the position as a string
	String() (name string)

	// CompareTo returns a true if the Position is smaller than another Position.
	// This function is used to sort Positions by the sort package.
	CompareTo(another Position) bool
}

A Position represents the position of a Delta in an object or an array.

type PostDelta

type PostDelta interface {
	// PostPosition returns the Position.
	PostPosition() Position

	// PostApply applies the delta to object.
	PostApply(object interface{}) interface{}
}

A PreDelta is a Delta that has a position of the right side JSON object. Deltas implements this interface should be applies after PreDeltas.

type PreDelta

type PreDelta interface {
	// PrePosition returns the Position.
	PrePosition() Position

	// PreApply applies the delta to object.
	PreApply(object interface{}) interface{}
}

A PreDelta is a Delta that has a position of the left side JSON object. Deltas implements this interface should be applies before PostDeltas.

type TextDiff

type TextDiff struct {
	Modified

	// Diff string
	Diff []dmp.Patch
}

A TextDiff represents a Modified with TextDiff between the old and the new values.

func NewTextDiff

func NewTextDiff(position Position, diff []dmp.Patch, oldValue, newValue interface{}) *TextDiff

NewTextDiff returns

func (*TextDiff) DiffString

func (d *TextDiff) DiffString() string

func (*TextDiff) PostApply

func (d *TextDiff) PostApply(object interface{}) interface{}

func (TextDiff) PostPosition

func (i TextDiff) PostPosition() Position

func (TextDiff) Similarity

func (cache TextDiff) Similarity() (similarity float64)

type Unmarshaller

type Unmarshaller struct {
}

func NewUnmarshaller

func NewUnmarshaller() *Unmarshaller

func (*Unmarshaller) UnmarshalBytes

func (um *Unmarshaller) UnmarshalBytes(diffBytes []byte) (Diff, error)

func (*Unmarshaller) UnmarshalObject

func (um *Unmarshaller) UnmarshalObject(diffObj map[string]interface{}) (Diff, error)

func (*Unmarshaller) UnmarshalReader

func (um *Unmarshaller) UnmarshalReader(diffReader io.Reader) (Diff, error)

func (*Unmarshaller) UnmarshalString

func (um *Unmarshaller) UnmarshalString(diffString string) (Diff, error)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL