Golang中如何正确将字符串映射追加到JSON

Golang中如何正确将字符串映射追加到JSON 大家好

我有配置

{
  "sites": [
{
  "http://site1.info": 0
},
{
  "https://site2.info": 0
},
{
  "https://site3.info": 0
}
],
"time": 5
}

和结构体

SiteList struct {
	Sites []map[string]int `json:"sites,omitempty"`
	Time  int `json:"time,omitempty"`
}

如何向我的JSON文件中追加内容或删除一个站点和整数值?


更多关于Golang中如何正确将字符串映射追加到JSON的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

感谢您的帮助!

更多关于Golang中如何正确将字符串映射追加到JSON的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请注意 Sites 是一个由 map 组成的切片。因此

  1. 创建一个新的 map
var m = make(map[string]int)
m["https://3.info:"] = 3
  1. 将此 map 添加到切片中
siteList.Sites = append(siteList.Sites, m)
  1. 要删除某个项目,只需按照从切片中移除元素的方式进行操作
func RemoveIndex(s []map[string]int, index int) []int {
    return append(s[:index], s[index+1:]...)
}
  1. 要更新文件,只需将新的 json 结构写入其中
file, _ := json.Marshal(siteList)
_ = ioutil.WriteFile("data.json", file, 0644)

在Go语言中,你可以通过以下方式操作JSON数据中的映射数组:

追加新站点

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type SiteList struct {
    Sites []map[string]int `json:"sites,omitempty"`
    Time  int              `json:"time,omitempty"`
}

func main() {
    // 读取现有JSON
    data := []byte(`{
        "sites": [
            {"http://site1.info": 0},
            {"https://site2.info": 0},
            {"https://site3.info": 0}
        ],
        "time": 5
    }`)

    var siteList SiteList
    json.Unmarshal(data, &siteList)

    // 追加新站点
    newSite := map[string]int{"https://site4.info": 1}
    siteList.Sites = append(siteList.Sites, newSite)

    // 序列化回JSON
    updatedJSON, _ := json.MarshalIndent(siteList, "", "  ")
    fmt.Println(string(updatedJSON))
}

删除特定站点

// 删除指定URL的站点
func removeSite(siteList *SiteList, urlToRemove string) {
    for i, site := range siteList.Sites {
        for key := range site {
            if key == urlToRemove {
                siteList.Sites = append(siteList.Sites[:i], siteList.Sites[i+1:]...)
                return
            }
        }
    }
}

// 使用示例
removeSite(&siteList, "https://site2.info")

完整文件操作示例

func updateJSONFile(filename string) error {
    // 读取文件
    data, err := os.ReadFile(filename)
    if err != nil {
        return err
    }

    var siteList SiteList
    json.Unmarshal(data, &siteList)

    // 追加操作
    siteList.Sites = append(siteList.Sites, map[string]int{"https://newsite.com": 2})

    // 删除操作
    removeSite(&siteList, "http://site1.info")

    // 写回文件
    updatedData, _ := json.MarshalIndent(siteList, "", "  ")
    return os.WriteFile(filename, updatedData, 0644)
}

更高效的删除方法(处理多个匹配)

func removeSites(siteList *SiteList, urlsToRemove []string) {
    newSites := make([]map[string]int, 0)
    
    for _, site := range siteList.Sites {
        shouldRemove := false
        for key := range site {
            for _, urlToRemove := range urlsToRemove {
                if key == urlToRemove {
                    shouldRemove = true
                    break
                }
            }
        }
        if !shouldRemove {
            newSites = append(newSites, site)
        }
    }
    
    siteList.Sites = newSites
}

这些操作会保持JSON结构不变,同时提供对站点数组的增删功能。

回到顶部