gitee.com/quant1x/gox@v1.21.2/util/linkedhashmap/serialization.go (about) 1 // Copyright (c) 2015, Emir Pasic. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package linkedhashmap 6 7 import ( 8 "bytes" 9 "encoding/json" 10 "gitee.com/quant1x/gox/util/internal" 11 ) 12 13 func assertSerializationImplementation() { 14 var _ internal.JSONSerializer = (*Map)(nil) 15 var _ internal.JSONDeserializer = (*Map)(nil) 16 } 17 18 // ToJSON outputs the JSON representation of map. 19 func (m *Map) ToJSON() ([]byte, error) { 20 var b []byte 21 buf := bytes.NewBuffer(b) 22 23 buf.WriteRune('{') 24 25 it := m.Iterator() 26 lastIndex := m.Size() - 1 27 index := 0 28 29 for it.Next() { 30 km, err := json.Marshal(it.Key()) 31 if err != nil { 32 return nil, err 33 } 34 buf.Write(km) 35 36 buf.WriteRune(':') 37 38 vm, err := json.Marshal(it.Value()) 39 if err != nil { 40 return nil, err 41 } 42 buf.Write(vm) 43 44 if index != lastIndex { 45 buf.WriteRune(',') 46 } 47 48 index++ 49 } 50 51 buf.WriteRune('}') 52 53 return buf.Bytes(), nil 54 } 55 56 // FromJSON populates map from the input JSON representation. 57 //func (m *Map) FromJSON(data []byte) error { 58 // elements := make(map[string]interface{}) 59 // err := json.Unmarshal(data, &elements) 60 // if err == nil { 61 // m.Clear() 62 // for key, value := range elements { 63 // m.Put(key, value) 64 // } 65 // } 66 // return err 67 //} 68 69 // FromJSON populates map from the input JSON representation. 70 func (m *Map) FromJSON(data []byte) error { 71 elements := make(map[string]interface{}) 72 err := json.Unmarshal(data, &elements) 73 if err != nil { 74 return err 75 } 76 77 index := make(map[string]int) 78 var keys []interface{} 79 for key := range elements { 80 keys = append(keys, key) 81 esc, _ := json.Marshal(key) 82 index[key] = bytes.Index(data, esc) 83 } 84 85 byIndex := func(a, b interface{}) int { 86 key1 := a.(string) 87 key2 := b.(string) 88 index1 := index[key1] 89 index2 := index[key2] 90 return index1 - index2 91 } 92 93 internal.Sort(keys, byIndex) 94 95 m.Clear() 96 97 for _, key := range keys { 98 m.Put(key, elements[key.(string)]) 99 } 100 101 return nil 102 }