github.com/GeniusesGroup/libgo@v0.0.0-20220929090155-5ff932cb408e/json/codec-runtime.go (about)

     1  /* For license and copyright information please see LEGAL file in repository */
     2  
     3  package json
     4  
     5  import (
     6  	"encoding/json"
     7  
     8  	"../protocol"
     9  )
    10  
    11  /*
    12  	********************PAY ATTENTION:*******************
    13  	We don't suggest use these codec instead use Codec and autogenerate needed code before compile time
    14  	and reduce runtime proccess to improve performance of the app and gain better performance from this protocol!
    15  */
    16  
    17  /*
    18  Field int `json:"{Name},{Option}"`
    19  Options:
    20  - Name		Other name than field name. Must be first option.
    21  - dash(-)	Don't encode||decode field!
    22  - omitempty Encode||Decode only field not nil!
    23  - string	base64 string! Use when array||slice numbers is not represent meaningful data. Also encode|decode numbers as string with "".
    24  - tuple		must assign to all fields to encode|decode as tuple array instead key-value object!
    25  
    26  Examples of struct field tags and their meanings:
    27  Field int `json:"myName"`           // Field appears in JSON as key "myName".
    28  Field int `json:"myName,omitempty"` // Field appears in JSON as key "myName" and the field is omitted from the object if its value is empty.
    29  Field int `json:",omitempty"`       // Field appears in JSON as key "Field" (the default), but the field is skipped if empty.
    30  Field int `json:"-"`                // Field is ignored by this package.
    31  Field int `json:"-,"`               // Field appears in JSON as key "-".
    32  */
    33  
    34  // Marshal encodes the value of s to the payload buffer in runtime.
    35  func Marshal(s interface{}) (p []byte, err protocol.Error) {
    36  	// TODO::: make better algorithm instead of below
    37  	var goErr error
    38  	p, goErr = json.Marshal(s)
    39  	if goErr != nil {
    40  		return nil, ErrEncodedCorrupted
    41  	}
    42  	return
    43  }
    44  
    45  // Unmarshal decode payload and stores the result in the value pointed to by s in runtime.
    46  func Unmarshal(p []byte, s interface{}) (err protocol.Error) {
    47  	// TODO::: make better algorithm instead of below
    48  	var goErr error = json.Unmarshal(p, s)
    49  	if goErr != nil {
    50  		return ErrEncodedCorrupted
    51  	}
    52  	return
    53  }
    54  
    55  // RunTimeCodec is a wrapper to use anywhere need protocol.Codec interface instead of protocol.JSON interface
    56  type RunTimeCodec struct {
    57  	t       interface{}
    58  	decoder interface{}
    59  	encoder interface{}
    60  	len     int
    61  }
    62  
    63  func NewRunTimeCodec(t interface{}) (codec *RunTimeCodec) {
    64  	codec = &RunTimeCodec{
    65  		t: t,
    66  		// len: json.LenAsJSON(),
    67  	}
    68  	// codec.encoder.buf = make([]byte, 0, codec.len)
    69  	return
    70  }