github.com/Finschia/finschia-sdk@v0.48.1/codec/json.go (about)

     1  package codec
     2  
     3  import (
     4  	"bytes"
     5  
     6  	"github.com/gogo/protobuf/jsonpb"
     7  	"github.com/gogo/protobuf/proto"
     8  
     9  	"github.com/Finschia/finschia-sdk/codec/types"
    10  )
    11  
    12  var defaultJM = &jsonpb.Marshaler{OrigName: true, EmitDefaults: true, AnyResolver: nil}
    13  
    14  // ProtoMarshalJSON provides an auxiliary function to return Proto3 JSON encoded
    15  // bytes of a message.
    16  func ProtoMarshalJSON(msg proto.Message, resolver jsonpb.AnyResolver) ([]byte, error) {
    17  	// We use the OrigName because camel casing fields just doesn't make sense.
    18  	// EmitDefaults is also often the more expected behavior for CLI users
    19  	jm := defaultJM
    20  	if resolver != nil {
    21  		jm = &jsonpb.Marshaler{OrigName: true, EmitDefaults: true, AnyResolver: resolver}
    22  	}
    23  	err := types.UnpackInterfaces(msg, types.ProtoJSONPacker{JSONPBMarshaler: jm})
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  
    28  	buf := new(bytes.Buffer)
    29  	if err := jm.Marshal(buf, msg); err != nil {
    30  		return nil, err
    31  	}
    32  
    33  	return buf.Bytes(), nil
    34  }