Skip to content

Commit

Permalink
Merge pull request #192 from emirpasic/json-interfaces
Browse files Browse the repository at this point in the history
Implements json.Marshaler and json.Unmarshaler interfaces
  • Loading branch information
emirpasic authored Apr 12, 2022
2 parents 7487c6a + 1f0b87f commit 56b5cc1
Show file tree
Hide file tree
Showing 35 changed files with 331 additions and 32 deletions.
4 changes: 4 additions & 0 deletions containers/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,14 @@ package containers
type JSONSerializer interface {
// ToJSON outputs the JSON representation of containers's elements.
ToJSON() ([]byte, error)
// MarshalJSON @implements json.Marshaler
MarshalJSON() ([]byte, error)
}

// JSONDeserializer provides JSON deserialization
type JSONDeserializer interface {
// FromJSON populates containers's elements from the input JSON representation.
FromJSON([]byte) error
// UnmarshalJSON @implements json.Unmarshaler
UnmarshalJSON([]byte) error
}
10 changes: 8 additions & 2 deletions lists/arraylist/arraylist_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package arraylist

import (
"encoding/json"
"fmt"
"github.com/emirpasic/gods/utils"
"strings"
Expand Down Expand Up @@ -620,11 +621,16 @@ func TestListSerialization(t *testing.T) {

assert()

json, err := list.ToJSON()
bytes, err := list.ToJSON()
assert()

err = list.FromJSON(json)
err = list.FromJSON(bytes)
assert()

bytes, err = json.Marshal([]interface{}{"a", "b", "c", list})
if err != nil {
t.Errorf("Got error %v", err)
}
}

func benchmarkGet(b *testing.B, list *List, size int) {
Expand Down
10 changes: 10 additions & 0 deletions lists/arraylist/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,13 @@ func (list *List) FromJSON(data []byte) error {
}
return err
}

// UnmarshalJSON @implements json.Unmarshaler
func (list *List) UnmarshalJSON(bytes []byte) error {
return list.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (list *List) MarshalJSON() ([]byte, error) {
return list.ToJSON()
}
10 changes: 8 additions & 2 deletions lists/doublylinkedlist/doublylinkedlist_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package doublylinkedlist

import (
"encoding/json"
"fmt"
"strings"
"testing"
Expand Down Expand Up @@ -626,11 +627,16 @@ func TestListSerialization(t *testing.T) {

assert()

json, err := list.ToJSON()
bytes, err := list.ToJSON()
assert()

err = list.FromJSON(json)
err = list.FromJSON(bytes)
assert()

bytes, err = json.Marshal([]interface{}{"a", "b", "c", list})
if err != nil {
t.Errorf("Got error %v", err)
}
}

func benchmarkGet(b *testing.B, list *List, size int) {
Expand Down
10 changes: 10 additions & 0 deletions lists/doublylinkedlist/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,13 @@ func (list *List) FromJSON(data []byte) error {
}
return err
}

// UnmarshalJSON @implements json.Unmarshaler
func (list *List) UnmarshalJSON(bytes []byte) error {
return list.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (list *List) MarshalJSON() ([]byte, error) {
return list.ToJSON()
}
10 changes: 10 additions & 0 deletions lists/singlylinkedlist/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,13 @@ func (list *List) FromJSON(data []byte) error {
}
return err
}

// UnmarshalJSON @implements json.Unmarshaler
func (list *List) UnmarshalJSON(bytes []byte) error {
return list.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (list *List) MarshalJSON() ([]byte, error) {
return list.ToJSON()
}
10 changes: 8 additions & 2 deletions lists/singlylinkedlist/singlylinkedlist_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package singlylinkedlist

import (
"encoding/json"
"fmt"
"strings"
"testing"
Expand Down Expand Up @@ -489,11 +490,16 @@ func TestListSerialization(t *testing.T) {

assert()

json, err := list.ToJSON()
bytes, err := list.ToJSON()
assert()

err = list.FromJSON(json)
err = list.FromJSON(bytes)
assert()

bytes, err = json.Marshal([]interface{}{"a", "b", "c", list})
if err != nil {
t.Errorf("Got error %v", err)
}
}

func benchmarkGet(b *testing.B, list *List, size int) {
Expand Down
10 changes: 8 additions & 2 deletions maps/hashbidimap/hashbidimap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package hashbidimap

import (
"encoding/json"
"fmt"
"testing"
)
Expand Down Expand Up @@ -174,11 +175,16 @@ func TestMapSerialization(t *testing.T) {

assert()

json, err := m.ToJSON()
bytes, err := m.ToJSON()
assert()

err = m.FromJSON(json)
err = m.FromJSON(bytes)
assert()

bytes, err = json.Marshal([]interface{}{"a", "b", "c", m})
if err != nil {
t.Errorf("Got error %v", err)
}
}

func sameElements(a []interface{}, b []interface{}) bool {
Expand Down
10 changes: 10 additions & 0 deletions maps/hashbidimap/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,13 @@ func (m *Map) FromJSON(data []byte) error {
}
return err
}

// UnmarshalJSON @implements json.Unmarshaler
func (m *Map) UnmarshalJSON(bytes []byte) error {
return m.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (m *Map) MarshalJSON() ([]byte, error) {
return m.ToJSON()
}
10 changes: 8 additions & 2 deletions maps/hashmap/hashmap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package hashmap

import (
"encoding/json"
"fmt"
"testing"
)
Expand Down Expand Up @@ -142,11 +143,16 @@ func TestMapSerialization(t *testing.T) {

assert()

json, err := m.ToJSON()
bytes, err := m.ToJSON()
assert()

err = m.FromJSON(json)
err = m.FromJSON(bytes)
assert()

bytes, err = json.Marshal([]interface{}{"a", "b", "c", m})
if err != nil {
t.Errorf("Got error %v", err)
}
}

func sameElements(a []interface{}, b []interface{}) bool {
Expand Down
10 changes: 10 additions & 0 deletions maps/hashmap/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,13 @@ func (m *Map) FromJSON(data []byte) error {
}
return err
}

// UnmarshalJSON @implements json.Unmarshaler
func (m *Map) UnmarshalJSON(bytes []byte) error {
return m.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (m *Map) MarshalJSON() ([]byte, error) {
return m.ToJSON()
}
11 changes: 11 additions & 0 deletions maps/linkedhashmap/linkedhashmap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package linkedhashmap

import (
"encoding/json"
"fmt"
"strings"
"testing"
Expand Down Expand Up @@ -571,6 +572,16 @@ func TestMapSerialization(t *testing.T) {
}
assertSerialization(deserialized, "C", t)
}

m := New()
m.Put("a", 1.0)
m.Put("b", 2.0)
m.Put("c", 3.0)

_, err := json.Marshal([]interface{}{"a", "b", "c", m})
if err != nil {
t.Errorf("Got error %v", err)
}
}

//noinspection GoBoolExpressions
Expand Down
10 changes: 10 additions & 0 deletions maps/linkedhashmap/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,13 @@ func (m *Map) FromJSON(data []byte) error {

return nil
}

// UnmarshalJSON @implements json.Unmarshaler
func (m *Map) UnmarshalJSON(bytes []byte) error {
return m.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (m *Map) MarshalJSON() ([]byte, error) {
return m.ToJSON()
}
10 changes: 10 additions & 0 deletions maps/treebidimap/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,13 @@ func (m *Map) FromJSON(data []byte) error {
}
return err
}

// UnmarshalJSON @implements json.Unmarshaler
func (m *Map) UnmarshalJSON(bytes []byte) error {
return m.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (m *Map) MarshalJSON() ([]byte, error) {
return m.ToJSON()
}
11 changes: 11 additions & 0 deletions maps/treebidimap/treebidimap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package treebidimap

import (
"encoding/json"
"fmt"
"github.com/emirpasic/gods/utils"
"strings"
Expand Down Expand Up @@ -604,6 +605,16 @@ func TestMapSerialization(t *testing.T) {
}
assertSerialization(deserialized, "C", t)
}

m := NewWith(utils.StringComparator, utils.Float64Comparator)
m.Put("a", 1.0)
m.Put("b", 2.0)
m.Put("c", 3.0)

_, err := json.Marshal([]interface{}{"a", "b", "c", m})
if err != nil {
t.Errorf("Got error %v", err)
}
}

//noinspection GoBoolExpressions
Expand Down
14 changes: 13 additions & 1 deletion maps/treemap/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

package treemap

import "github.com/emirpasic/gods/containers"
import (
"github.com/emirpasic/gods/containers"
)

func assertSerializationImplementation() {
var _ containers.JSONSerializer = (*Map)(nil)
Expand All @@ -20,3 +22,13 @@ func (m *Map) ToJSON() ([]byte, error) {
func (m *Map) FromJSON(data []byte) error {
return m.tree.FromJSON(data)
}

// UnmarshalJSON @implements json.Unmarshaler
func (m *Map) UnmarshalJSON(bytes []byte) error {
return m.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (m *Map) MarshalJSON() ([]byte, error) {
return m.ToJSON()
}
11 changes: 11 additions & 0 deletions maps/treemap/treemap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package treemap

import (
"encoding/json"
"fmt"
"strings"
"testing"
Expand Down Expand Up @@ -627,6 +628,16 @@ func TestMapSerialization(t *testing.T) {
}
assertSerialization(deserialized, "C", t)
}

m := NewWithStringComparator()
m.Put("a", 1.0)
m.Put("b", 2.0)
m.Put("c", 3.0)

_, err := json.Marshal([]interface{}{"a", "b", "c", m})
if err != nil {
t.Errorf("Got error %v", err)
}
}

//noinspection GoBoolExpressions
Expand Down
10 changes: 8 additions & 2 deletions sets/hashset/hashset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package hashset

import (
"encoding/json"
"testing"
)

Expand Down Expand Up @@ -98,11 +99,16 @@ func TestSetSerialization(t *testing.T) {

assert()

json, err := set.ToJSON()
bytes, err := set.ToJSON()
assert()

err = set.FromJSON(json)
err = set.FromJSON(bytes)
assert()

bytes, err = json.Marshal([]interface{}{"a", "b", "c", set})
if err != nil {
t.Errorf("Got error %v", err)
}
}

func benchmarkContains(b *testing.B, set *Set, size int) {
Expand Down
10 changes: 10 additions & 0 deletions sets/hashset/serialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,13 @@ func (set *Set) FromJSON(data []byte) error {
}
return err
}

// UnmarshalJSON @implements json.Unmarshaler
func (set *Set) UnmarshalJSON(bytes []byte) error {
return set.FromJSON(bytes)
}

// MarshalJSON @implements json.Marshaler
func (set *Set) MarshalJSON() ([]byte, error) {
return set.ToJSON()
}
Loading

0 comments on commit 56b5cc1

Please sign in to comment.