gpt4 book ai didi

json - 将类型编码为 JSON 时将字符串附加到成员

转载 作者:IT王子 更新时间:2023-10-29 02:34:04 24 4
gpt4 key购买 nike

我有一个带有名为“Url”的值成员的类型。将此类型编码为 json 时,我想在 Url 前面加上 HOST 值。实现这一目标的最佳方法是什么?

在这个例子中,Println语句打印{"url":"/thisurl"},我希望它打印{"url":"http://myhost.com/thisurl"}

package main

import "fmt"
import "encoding/json"

type Post struct {
Url string `json:"url"`
}

const (
HOST = "http://myhost.com"
)

func main() {
post := Post{"/thisurl"}
marshaled, _ := json.Marshal(post)

fmt.Println(string(marshaled))
//{"url":"/thisurl"}
}

更新

我可以在 json.Marshal 行之前重新分配 post.Url

post.Url = fmt.Sprintf("%s%s", HOST, post.Url)

但这感觉有点乱,如果我每次想编码为 json 时都必须记住重新分配。

我不想更改 post.Url 的值,我只是想更改它作为 json 的表示方式。

最佳答案

如果您想更改(未)编码行为,请使用实现 json.Marshaler 的自定义类型(可能还有 json.Unmarshaler)。

package main

import (
"encoding/json"
"fmt"
)

type Post struct {
URL URLString `json:"url"`
}

const (
Host = "http://myhost.com"
)

type URLString string

func (u URLString) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`"%s%s"`, Host, u)), nil
}

func main() {
post := Post{"/thisurl"}
marshaled, _ := json.Marshal(post)

fmt.Println(string(marshaled))
//{"url":"http://myhost.com/thisurl"}
}

Playground

(另请注意,对常量使用全部大写是 not idiomaticgolint 推荐使用 URLMyURLHTTPIDUrlMyUrlId)。

关于json - 将类型编码为 JSON 时将字符串附加到成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30196021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com