JSON for Message Payloads in Messaging
The basic structure of a NATS message modeled in the client libraries includes the subject the message was published to, the application-defined payload, and an optional set of headers (for requests, there is also a reply-to subject). The payload is a sequence of bytes, so it is up to the application to define how to serialize and deserialize the payload.
JSON is ubiquitous and simple data-interchange format that is supported in virtually all programming languages. This example demonstrates how to serialize and deserialize a message payload using a JSON library.
Code
package main
import (
	"encoding/json"
	"fmt"
	"os"
	"time"
	"github.com/nats-io/nats.go"
)
type payload struct {
	Foo string `json:"foo"`
	Bar int    `json:"bar"`
}
func main() {
        Use the env variable if running in the container, otherwise use the default.
	url := os.Getenv("NATS_URL")
	if url == "" {
		url = nats.DefaultURL
	}
        Create an unauthenticated connection to NATS.
	nc, _ := nats.Connect(url)
	defer nc.Drain()
        Create a subscription that receives two messages. One message will contain a valid serialized payload and the other will not.
	sub, _ := nc.SubscribeSync("foo")
	sub.AutoUnsubscribe(2)
        Construct a Payload value and serialize it.
	p := &payload{
		Foo: "bar",
		Bar: 27}
	p_json, _ := json.Marshal(p)
        Publish the serialized payload.
	nc.Publish("foo", p_json)
	nc.Publish("foo", []byte("not json"))
        Loop through the expected messages and attempt to deserialize the payload into a payload value. If deserialization into this type fails, alternate handling can be performed, either discarding or attempting to deserialize in a more general type (such as the empty interface): var dat map[string]interface{}
	var dat payload
	for {
		msg, err := sub.NextMsg(time.Second)
		if err != nil {
			break
		}
		err = json.Unmarshal(msg.Data, &dat)
		if err != nil {
			fmt.Printf("received invalid JSON payload: %s\n", msg.Data)
		} else {
			fmt.Printf("received valid JSON payload: %+v\n", dat)
		}
	}
}
        Output
received valid JSON payload: {Foo:bar Bar:27}
received invalid JSON payload: not json