我的图像具有以下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/

10-17 01:38