我有点问题。因此,我正在用go编写一个工具,它可以处理一些json文件。该工具的工作方式是使用它的devops成员,该成员应该将他们的json文件上传到项目中的指定文件夹中,然后从那里使用json文件在api -网关中部署api( json实际上是带有扩展的自夸,但这对我的问题并不特别重要)。
我的问题是我需要更新json中的一行。每个传入的文件将是不同的,但由于项目的性质,它保证每次都在相同的位置上有一个url。我需要以自动化的方式更新这个网址。
由于json文件是不同的,设置硬编码结构和解编组以便编辑是不可能的。目标是让用户不必进入代码,而只是部署他们的文件,这也是我希望这些文件能够被自动化的原因。
到目前为止,我的研究没有取得任何成果。看来,Go只支持编辑json,如果它首先被解封为结构(请参阅使用Golang修改JSON文件)。是否有一种没有结构的编辑方法,如果我知道我要寻找的东西在json中总是可用的,尽管每个文件是不同的?
这只是我使用go的第一个月,所以可能有一个简单的解决方案。我见过一些关于巨木图书馆的扫描仪的报道,但我似乎也没办法让它起作用。
{
"paths": {
"/account": {
"post": {
"something": "body",
"api": {
"uri": "http://thisiswhereineedtoedit.com"
}
}
}
}}
发布于 2018-07-11 21:42:53
解封到interface{}。向下遍历嵌套对象,以找到要设置值的对象。设定值。法警回到JSON。
var root interface{}
if err := json.Unmarshal(d, &root); err != nil {
log.Fatal(err)
}
// Walk down path to target object.
v := root
var path = []string{"paths", "/account", "post", "api"}
for i, k := range path {
m, ok := v.(map[string]interface{})
if !ok {
log.Fatalf("map not found at %s", strings.Join(path[:i+1], ", "))
}
v, ok = m[k]
if !ok {
log.Fatalf("value not found at %s", strings.Join(path[:i+1], ", "))
}
}
// Set value in the target object.
m, ok := v.(map[string]interface{})
if !ok {
log.Fatalf("map not found at %s", strings.Join(path, ", "))
}
m["uri"] = "the new URI"
// Marshal back to JSON. Variable d is []byte with the JSON
d, err := json.Marshal(root)
if err != nil {
log.Fatal(err)
}用任何适合您的应用程序的错误处理替换对log.Fatal的调用。
发布于 2018-07-11 21:11:30
解决这个问题的一种方法是读取文件并对其进行更改。
让我们假设您有您提到的文件:
example.json
{
"paths": {
"/account": {
"post": {
"something": "body",
"api": {
"uri": "http://thisiswhereineedtoedit.com"
}
}
}
}
}我们想用"uri"来改变这条线。
您应该比我在本例中更具体,做一个占位符或什么的-以避免更改错误的行.
您可以使用类似于以下内容的小型程序:
package main
import (
"io/ioutil"
"log"
"strings"
)
func main() {
file := "./example.json"
url := "\"uri\": \"supreme-uri\""
// Read the file
input, err := ioutil.ReadFile(file)
if err != nil {
log.Fatalln(err)
}
// Split it into lines
lines := strings.Split(string(input), "\n")
// Find the line that contains our "placeholder" / "uri"
for i, line := range lines {
if strings.Contains(line, "\"uri\":") {
// Replace the line
lines[i] = "\"uri\": " + url
}
}
// Join lines and write to file
output := strings.Join(lines, "\n")
err = ioutil.WriteFile(file, []byte(output), 0644)
if err != nil {
log.Fatalln(err)
}
}在运行程序之后,我们的example.json文件现在如下所示:
{
"paths": {
"/account": {
"post": {
"something": "body",
"api": {
"uri": "supreme-uri"
}
}
}
}
}希望您发现这个解决方案有用,祝您好运!
发布于 2022-09-30 08:28:30
你可以试试跨平面运行时的filepath pkg。您可以指定JSON路径,并获取或设置所需的结果,如上面链接中的示例所示。
https://stackoverflow.com/questions/51293840
复制相似问题