Skip to content

[Feature Request] Support for dynamic tag selection in Marshal/Unmarshal #550

@Funnyang

Description

@Funnyang

This feature would enable users to serialize/deserialize the same Go struct to/from different JSON formats based on a specified tag name (e.g., for different API versions, client needs, or internal/external representations).

Here's an example to illustrate the desired behavior:

type Request struct {
    UserId   string `json:"user_id" custom_scene:"uid"`
    NickName string `json:"nick_name"`
    Age      string `json:"age"`
}

Proposed Usage:

A new function signature or an option for json.Marshal and json.Unmarshal that accepts a tagName argument. When tagName is provided, go-json would prioritize using the value from that tag; if the specified tag doesn't exist for a field, it would fall back to the default json tag.

Code Example:

req := Request{
    UserId:   "user1",
    NickName: "mono",
    Age:      "30",
}

// Marshal using "custom_scene" tag if present, otherwise default to "json" tag
// (This is conceptual syntax, exact API could vary)
// Example 1: With a new function
// jsonData, err := json.MarshalWithTag(req, "custom_scene")

// Example 2: With an option struct
// jsonData, err := json.MarshalWithOptions(req, json.MarshalOption{TagName: "custom_scene"})

// For demonstration, let's assume `json.Marshal(req, "custom_scene")` is the proposed syntax
jsonData, err := json.Marshal(req, "custom_scene") // custom_scene is the specified tag name

if err != nil {
    // handle error
}
fmt.Println(string(jsonData))

Expected Result:

{
    "uid": "user1",
    "nick_name": "mono",
    "age": "30"
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions