Home > Backend Development > Golang > How Can I Unmarshal JSON with One Set of Tags and Marshal with Another in Go?

How Can I Unmarshal JSON with One Set of Tags and Marshal with Another in Go?

Barbara Streisand
Release: 2025-01-03 14:40:40
Original
375 people have browsed it

How Can I Unmarshal JSON with One Set of Tags and Marshal with Another in Go?

Marshalling and Unmarshalling with Multiple JSON Tags

When unmarshalling JSON data into a struct, each field must have a corresponding JSON tag to specify its corresponding JSON key. However, sometimes you may need to create a new JSON file with the same data but different JSON tags.

In your case, you wish to unmarshal the JSON {"name":"Sam","age":20} to the struct Foo, and then create a modified version with the tags employee_name and - to send to another server.

While it would be convenient to assign multiple JSON tags to a single field as you proposed, this is not supported within the encoding/json package in Go. Instead, you can achieve the desired result by utilizing unexported types and casting.

package main

import (
    "bytes"
    "encoding/json"
)

type Foo struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    data := []byte(`{"name":"Sam","age":20}`)

    // Unmarshal to Foo
    var foo Foo
    json.Unmarshal(data, &foo)

    // Create a new type with modified tags
    type Bar struct {
        Name string `json:"employee_name"`
        Age  int    `json:"-"`
    }

    // Cast from Foo to Bar
    bar := Bar(foo)

    // Marshal Bar
    buf := new(bytes.Buffer)
    json.NewEncoder(buf).Encode(bar)

    println(buf.String())
}
Copy after login

Note: This approach relies on the unexported type Bar. Using unexported types helps prevent accidental usage elsewhere in the codebase. Additionally, ensure that the field names, types, and ordering in both structs match exactly for the casting to work correctly.

The above is the detailed content of How Can I Unmarshal JSON with One Set of Tags and Marshal with Another in Go?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template