Skip to Content

JSON

The examples use the following prisma schema:

model Log {
  id      String   @id @default(cuid())
  date    DateTime @default(now())
  message String
  meta    Json
}

How JSON works in the Go client

JSON works by using Go’s json.RawMessage data structure. It’s a []byte behind the scenes, which means you can use the API you already know to work with unstructured json data in the Go client.

You can work with []bytes directly, but usually you marshal this data from an existing struct or unmarshal the data to a given struct variable.

Write JSON data

type LogInfo struct {
  Service string `json:"service"`
}
 
logInfo := &LogInfo{
  Service: "deployment/api",
}
infoBytes, err := json.Marshal(logInfo)
if err != nil {
  panic(err)
}
 
_, err = client.Log.CreateOne(
  db.Log.Message.Set("/api/graphql: status code 400"),
  db.Log.Info.Set(infoBytes),
  db.Log.ID.Set("123"),
).Exec(ctx)
if err != nil {
  panic(err)
}

Read JSON data

log, err := client.Log.FindUnique(
  db.Log.ID.Equals("123"),
).Exec(ctx)
if err != nil {
  panic(err)
}
 
// log.Info is of type json.RawMessage, so this will contain binary data such as [123 34 97 116 116 ...]
// however, if we format it with %s, we can convert the contents to a string to see what's inside:
log.Printf("log info: %s", log.Info)
 
// to unmarshal this information into a specific struct, we make use of Go's usual handling of json data:
 
type LogInfo struct {
  Service string `json:"service"`
}
 
var info LogInfo
if err := json.Unmarshal(log.Info, &info); err != nil {
  panic(err)
}
log.Printf("log info: %+v", info)

Query JSON

You can filter JSON fields by using a combination of Path and a JSON query. Note that the syntax differs between databases.

actual, err := client.User.FindFirst(
  User.Meta.Path([]string{"service"}),
  User.Meta.StringContains("api"),
).Exec(ctx)
actual, err := client.User.FindFirst(
  User.Meta.Path([]string{"service"}),
  // Note that Equals accepts JSON, so strings need to be surrounded with quotes
  User.Meta.Equals(JSON(`"deployment/api"`)),
).Exec(ctx)

For more information about all json filters and more example queries, check out the Prisma JSON filters documentation.