github.com/zhongdalu/gf@v1.0.0/g/encoding/gjson/gjson_func.go (about)

     1  // Copyright 2017 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/zhongdalu/gf.
     6  
     7  package gjson
     8  
     9  //func MarshalOrdered(value interface{}) ([]byte, error) {
    10  //	buffer := bytes.NewBuffer(nil)
    11  //	rv     := reflect.ValueOf(value)
    12  //	kind   := rv.Kind()
    13  //	if kind == reflect.Ptr {
    14  //		rv   = rv.Elem()
    15  //		kind = rv.Kind()
    16  //	}
    17  //	switch kind {
    18  //		case reflect.Slice: fallthrough
    19  //		case reflect.Array:
    20  //			buffer.WriteByte('[')
    21  //			length := rv.Len()
    22  //			for i := 0; i < length; i++ {
    23  //				if p, err := MarshalOrdered(rv.Index(i).Interface()); err != nil {
    24  //					return nil, err
    25  //				} else {
    26  //					buffer.Write(p)
    27  //					if i < length - 1 {
    28  //						buffer.WriteByte(',')
    29  //					}
    30  //				}
    31  //			}
    32  //			buffer.WriteByte(']')
    33  //		case reflect.Map: fallthrough
    34  //		case reflect.Struct:
    35  //			m     := gconv.Map(value, "json")
    36  //			keys  := make([]string, len(m))
    37  //			index := 0
    38  //			for key := range m {
    39  //				keys[index] = key
    40  //				index++
    41  //			}
    42  //			sort.Strings(keys)
    43  //			buffer.WriteByte('{')
    44  //			for i, key := range keys {
    45  //				if p, err := MarshalOrdered(m[key]); err != nil {
    46  //					return nil, err
    47  //				} else {
    48  //					buffer.WriteString(fmt.Sprintf(`"%s":%s`, key, string(p)))
    49  //					if i < index - 1 {
    50  //						buffer.WriteByte(',')
    51  //					}
    52  //				}
    53  //			}
    54  //			buffer.WriteByte('}')
    55  //		default:
    56  //			if p, err := json.Marshal(value); err != nil {
    57  //				return nil, err
    58  //			} else {
    59  //				buffer.Write(p)
    60  //			}
    61  //	}
    62  //	return buffer.Bytes(), nil
    63  //}