我的图像具有以下json结构:
{"image": [
{
"bytesize": "-2",
"default": "redlight_drdefault"
},
{
"active": "JV77tdMcHkChFaF2H9uoDHepPhUcrlprYEsQr-r-1lg=",
"bytesize": "566806"
}
]}
我想将名为“ Activity ”的字段更改为“不 Activity ”,而不更改存储在字段中的值,如下所示:
{"image": [
{
"bytesize": "-2",
"default": "redlight_drdefault"
},
{
"inactive": "JV77tdMcHkChFaF2H9uoDHepPhUcrlprYEsQr-r-1lg=",
"bytesize": "566806"
}
]}
有人能解决这个问题吗?如果您可以在操场上展示,那就太好了。
我在附加新值时遇到困难:
mapactive := map[string]string{"active": "gj65vn768=",
"bytesize":"76878768" }
如何将此附加到提供给我的解决方案中??应在使所有 Activity 密钥都处于非 Activity 状态的末尾附加此内容。
最佳答案
Golang允许在类型相同的结构之间进行直接转换,即使它们的字段标签不同也是如此。也就是说,您可以直接在以下之间进行转换:
type Active struct {
Active string `json:"active"`
ByteSize string `json:"bytesize"`
}
和
type Inactive struct {
Active string `json:"inactive"`
ByteSize string `json:"bytesize"`
}
使用以下内容:
var a Active
// decode JSON into a
var b Inactive = Inactive(a) // direct conversion allowed
但是,您输入的JSON将不容易支持此功能。尽管列表中的各个条目实际上在类型或字段上并不相同,但您输入的JSON仍将
image
字段列为列表。在这种情况下,唯一真正的选择是将其解析为map[string]interface{}
的嵌套集:https://play.golang.org/p/4NgiKLlHg8c
parsed := make(map[string]interface{})
if err := json.Unmarshal([]byte(input), &parsed); err != nil {
panic(err)
}
img, ok := parsed["image"]
if ok {
if imglist, ok := img.([]interface{}); ok {
for i, mi := range imglist {
if m, ok := mi.(map[string]interface{}); ok {
for k, v := range m {
if k == "active" {
m["inactive"] = v
delete(m, "active")
imglist[i] = m
}
}
}
}
}
}
b, err := json.Marshal(img)
if err != nil {
panic(err)
}
请注意,我已从此代码中删除了许多健全性检查,以使其更短,更易读。使用嵌套的接口映射来处理JSON本质上是一团糟。如果您可以更改输入JSON的格式,那么这样做会带来更好的运气和更易于维护的代码。
关于json - 如何使用golang将事件字段更改为非事件字段以保持字段值不变?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48708498/