如何将mapstructure标签用作json标签?

I'm introducing a package from a third party that has this struct with mapstructure tag.

I want the instance of this struct to be json with mapstructure specified value.What should I do?

I can add json tag, but in doing so,I modify package files,I think this is a bad way.

type ServiceConfig struct {
    // name of the service
    Name string `mapstructure:"name"`
    // set of endpoint definitions
    Endpoints string `mapstructure:"end_points"`
    // defafult timeout
    Timeout time.Duration `mapstructure:"timeout"`
}

I want to get:

{"name":"sss", "end_points" :"xxx", "timeout" : "120"}

If you do not want to modify the package files, you can create another struct with the same field names, but with JSON tags, and copy:

type JSONServiceConfig struct {
    Name      string        `json:"name"`
    Endpoints string        `json:"end_points"`
    Timeout   time.Duration `json:"timeout"`
}

Then:

x := JSONServiceConfig(serviceConfig)

You cannot do what you want without modifying the mapstructure source, and it would probably get a little bit hairy if you want to specify options, such as json's omitempty. However, you can simply add a second struct tag for this

type ServiceConfig struct {
    // name of the service
    Name string `mapstructure:"name" json:"name"`
    // set of endpoint definitions
    Endpoints string `mapstructure:"end_points" json:"end_points"`
    // defafult timeout
    Timeout time.Duration `mapstructure:"timeout" json:"timeout"`
}

From the documentation of reflect

By convention, tag strings are a concatenation of optionally space-separated key:"value" pairs. Each key is a non-empty string consisting of non-control characters other than space (U+0020 ' '), quote (U+0022 '"'), and colon (U+003A ':'). Each value is quoted using U+0022 '"' characters and Go string literal syntax.

Here's a simple example on the playground