mirror of
https://github.com/emirpasic/gods
synced 2024-11-06 15:20:25 +00:00
- JSON serialization for all lists
This commit is contained in:
parent
51d19e739f
commit
0dcb10bcab
@ -9,6 +9,8 @@
|
|||||||
// Iterators provide stateful iterators.
|
// Iterators provide stateful iterators.
|
||||||
//
|
//
|
||||||
// Enumerable provides Ruby inspired (each, select, map, find, any?, etc.) container functions.
|
// Enumerable provides Ruby inspired (each, select, map, find, any?, etc.) container functions.
|
||||||
|
//
|
||||||
|
// Serialization provides serializers (marshalers) and deserializers (unmarshalers).
|
||||||
package containers
|
package containers
|
||||||
|
|
||||||
import "github.com/emirpasic/gods/utils"
|
import "github.com/emirpasic/gods/utils"
|
||||||
|
17
containers/serialization.go
Normal file
17
containers/serialization.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package containers
|
||||||
|
|
||||||
|
// JSONSerializer provides JSON serialization
|
||||||
|
type JSONSerializer interface {
|
||||||
|
// ToJSON outputs the JSON representation of containers's elements.
|
||||||
|
ToJSON() ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSONDeserializer provides JSON deserialization
|
||||||
|
type JSONDeserializer interface {
|
||||||
|
// FromJSON populates containers's elements from the input JSON representation.
|
||||||
|
FromJSON([]byte) error
|
||||||
|
}
|
@ -426,6 +426,32 @@ func TestListIteratorLast(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListSerialization(t *testing.T) {
|
||||||
|
list := New()
|
||||||
|
list.Add("a", "b", "c")
|
||||||
|
|
||||||
|
var err error
|
||||||
|
assert := func() {
|
||||||
|
if actualValue, expectedValue := fmt.Sprintf("%s%s%s", list.Values()...), "abc"; actualValue != expectedValue {
|
||||||
|
t.Errorf("Got %v expected %v", actualValue, expectedValue)
|
||||||
|
}
|
||||||
|
if actualValue, expectedValue := list.Size(), 3; actualValue != expectedValue {
|
||||||
|
t.Errorf("Got %v expected %v", actualValue, expectedValue)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Got error %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert()
|
||||||
|
|
||||||
|
json, err := list.ToJSON()
|
||||||
|
assert()
|
||||||
|
|
||||||
|
err = list.FromJSON(json)
|
||||||
|
assert()
|
||||||
|
}
|
||||||
|
|
||||||
func benchmarkGet(b *testing.B, list *List, size int) {
|
func benchmarkGet(b *testing.B, list *List, size int) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
for n := 0; n < size; n++ {
|
for n := 0; n < size; n++ {
|
||||||
|
29
lists/arraylist/serialization.go
Normal file
29
lists/arraylist/serialization.go
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package arraylist
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/emirpasic/gods/containers"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertSerializationImplementation() {
|
||||||
|
var _ containers.JSONSerializer = (*List)(nil)
|
||||||
|
var _ containers.JSONDeserializer = (*List)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToJSON outputs the JSON representation of list's elements.
|
||||||
|
func (list *List) ToJSON() ([]byte, error) {
|
||||||
|
return json.Marshal(list.elements[:list.size])
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromJSON populates list's elements from the input JSON representation.
|
||||||
|
func (list *List) FromJSON(data []byte) error {
|
||||||
|
err := json.Unmarshal(data, &list.elements)
|
||||||
|
if err == nil {
|
||||||
|
list.size = len(list.elements)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
@ -426,6 +426,32 @@ func TestListIteratorLast(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListSerialization(t *testing.T) {
|
||||||
|
list := New()
|
||||||
|
list.Add("a", "b", "c")
|
||||||
|
|
||||||
|
var err error
|
||||||
|
assert := func() {
|
||||||
|
if actualValue, expectedValue := fmt.Sprintf("%s%s%s", list.Values()...), "abc"; actualValue != expectedValue {
|
||||||
|
t.Errorf("Got %v expected %v", actualValue, expectedValue)
|
||||||
|
}
|
||||||
|
if actualValue, expectedValue := list.Size(), 3; actualValue != expectedValue {
|
||||||
|
t.Errorf("Got %v expected %v", actualValue, expectedValue)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Got error %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert()
|
||||||
|
|
||||||
|
json, err := list.ToJSON()
|
||||||
|
assert()
|
||||||
|
|
||||||
|
err = list.FromJSON(json)
|
||||||
|
assert()
|
||||||
|
}
|
||||||
|
|
||||||
func benchmarkGet(b *testing.B, list *List, size int) {
|
func benchmarkGet(b *testing.B, list *List, size int) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
for n := 0; n < size; n++ {
|
for n := 0; n < size; n++ {
|
||||||
|
31
lists/doublylinkedlist/serialization.go
Normal file
31
lists/doublylinkedlist/serialization.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package doublylinkedlist
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/emirpasic/gods/containers"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertSerializationImplementation() {
|
||||||
|
var _ containers.JSONSerializer = (*List)(nil)
|
||||||
|
var _ containers.JSONDeserializer = (*List)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToJSON outputs the JSON representation of list's elements.
|
||||||
|
func (list *List) ToJSON() ([]byte, error) {
|
||||||
|
return json.Marshal(list.Values())
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromJSON populates list's elements from the input JSON representation.
|
||||||
|
func (list *List) FromJSON(data []byte) error {
|
||||||
|
elements := []interface{}{}
|
||||||
|
err := json.Unmarshal(data, &elements)
|
||||||
|
if err == nil {
|
||||||
|
list.Clear()
|
||||||
|
list.Add(elements...)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
31
lists/singlylinkedlist/serialization.go
Normal file
31
lists/singlylinkedlist/serialization.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package singlylinkedlist
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/emirpasic/gods/containers"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertSerializationImplementation() {
|
||||||
|
var _ containers.JSONSerializer = (*List)(nil)
|
||||||
|
var _ containers.JSONDeserializer = (*List)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToJSON outputs the JSON representation of list's elements.
|
||||||
|
func (list *List) ToJSON() ([]byte, error) {
|
||||||
|
return json.Marshal(list.Values())
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromJSON populates list's elements from the input JSON representation.
|
||||||
|
func (list *List) FromJSON(data []byte) error {
|
||||||
|
elements := []interface{}{}
|
||||||
|
err := json.Unmarshal(data, &elements)
|
||||||
|
if err == nil {
|
||||||
|
list.Clear()
|
||||||
|
list.Add(elements...)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user