In my app, I receive a json from the client. This json can be anything since the user defines the keys and the values. In the backend I store it as string in the datastore.
Now i'm trying to override the MarshalJson / UnmarshalJson functions so that what I send / receive from the client is not a string but a json.
I can't figure out how to convert a string to json in go.
my structure
type ContextData string
type Iot struct {
Id IotId `json:"id,string" datastore:"-" goon:"id"`
Name string `json:"name"`
Context ContextData `json:"context" datastore:",noindex"` }
example of received data
{ 'id' : '',
'name' '',
'context': {
'key1': value1,
'key2': value2 }}
how i want to store this Context field in the datastore as a noindex string '{'key1':value1, 'key2':value2}'
example of data i want to send
{ 'id' : '',
'name' '',
'context': {
'key1': value1,
'key2': value2 }}
If I understand your problem correctly, you want to use json.RawMessage
as Context
.
RawMessage is a raw encoded JSON object. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding.
RawMessage is just []byte
, so you can keep it in data store and then attach it for an outgoing messages as "precomputed JSON".
type Iot struct {
Id int `json:"id"`
Name string `json:"name"`
Context json.RawMessage `json:"context"` // RawMessage here! (not a string)
}
func main() {
in := []byte(`{"id":1,"name":"test","context":{"key1":"value1","key2":2}}`)
var iot Iot
err := json.Unmarshal(in, &iot)
if err != nil {
panic(err)
}
// Context is []byte, so you can keep it as string in DB
fmt.Println("ctx:", string(iot.Context))
// Marshal back to json (as original)
out, _ := json.Marshal(&iot)
fmt.Println(string(out))
}
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments