Skip to content

Protobuf compiler plugin to generate Go JSON Marshal/Unmarshal implementations for messages using jsonpb.

License

Notifications You must be signed in to change notification settings

kevpie/protoc-gen-go-json

This branch is 3 commits behind mitchellh/protoc-gen-go-json:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

4582252 · Oct 9, 2021

History

31 Commits
Jan 10, 2021
Jan 10, 2021
Jul 17, 2020
Jan 10, 2021
Oct 9, 2021
Aug 6, 2019
Apr 14, 2020
Jan 11, 2021
Jan 10, 2021
Jan 10, 2021
Jan 10, 2021
Sep 17, 2020

Repository files navigation

protoc-gen-go-json

This is a plugin for the Google Protocol Buffers compiler protoc that generates code to implement json.Marshaler and json.Unmarshaler using protojson.

This enables Go-generated protobuf messages to be embedded directly within other structs and encoded with the standard JSON library, since the standard encoding/json library can't encode certain protobuf messages such as those that contain oneof fields.

Install

go get github.com/mitchellh/protoc-gen-go-json

Also required:

Usage

Define your messages like normal:

syntax = "proto3";

message Request {
  oneof kind {
    string name = 1;
    int32  code = 2;
  }
}

The example message purposely uses a oneof since this won't work by default with encoding/json. Next, generate the code:

protoc --go_out=. --go-json_out=. request.proto

Your output should contain a file request.pb.json.go which contains the implementation of json.Marshal/Unmarshal for all your message types. You can then encode your messages using standard encoding/json:

import "encoding/json"

// Marshal
bs, err := json.Marshal(&Request{
  Kind: &Kind_Name{
    Name: "alice",
  },
}

// Unmarshal
var result Request
json.Unmarshal(bs, &result)

Options

The generator supports options you can specify via the command-line:

  • enums_as_ints={bool} - Render enums as integers instead of strings.
  • emit_defaults={bool} - Render fields with zero values.
  • orig_name={bool} - Use original (.proto file) name for fields.
  • allow_unknown={bool} - Allow messages to contain unknown fields when unmarshaling

It also includes the "standard" options available to all protogen-based plugins:

  • import_path={path} - Override the import path
  • paths=source_relative - Derive the output path from the input path
  • etc.

These can be set as part of the --go-json_out value:

protoc --go-json_opt=emit_defaults=true:.

You can specify multiple using a ,:

protoc --go-json_out=enums_as_ints=true,emit_defaults=true:.

Alternatively, you may also specify options using the --go-json_opt value:

protoc --go-json_out:. --go-json_opt=emit_defaults=true,enums_as_ints=true

About

Protobuf compiler plugin to generate Go JSON Marshal/Unmarshal implementations for messages using jsonpb.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 70.3%
  • Nix 16.6%
  • Dockerfile 10.3%
  • Makefile 2.8%