首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go中编辑Json而不首先将其编组到结构中

在Go中编辑Json而不首先将其编组到结构中
EN

Stack Overflow用户
提问于 2018-07-11 20:38:24
回答 3查看 1.3K关注 0票数 3

我有点问题。因此,我正在用go编写一个工具,它可以处理一些json文件。该工具的工作方式是使用它的devops成员,该成员应该将他们的json文件上传到项目中的指定文件夹中,然后从那里使用json文件在api -网关中部署api( json实际上是带有扩展的自夸,但这对我的问题并不特别重要)。

我的问题是我需要更新json中的一行。每个传入的文件将是不同的,但由于项目的性质,它保证每次都在相同的位置上有一个url。我需要以自动化的方式更新这个网址。

由于json文件是不同的,设置硬编码结构和解编组以便编辑是不可能的。目标是让用户不必进入代码,而只是部署他们的文件,这也是我希望这些文件能够被自动化的原因。

到目前为止,我的研究没有取得任何成果。看来,Go只支持编辑json,如果它首先被解封为结构(请参阅使用Golang修改JSON文件)。是否有一种没有结构的编辑方法,如果我知道我要寻找的东西在json中总是可用的,尽管每个文件是不同的?

这只是我使用go的第一个月,所以可能有一个简单的解决方案。我见过一些关于巨木图书馆的扫描仪的报道,但我似乎也没办法让它起作用。

代码语言:javascript
复制
{
"paths": {
    "/account": {
        "post": {
            "something": "body",
            "api": {
                "uri": "http://thisiswhereineedtoedit.com"
            }
        }
    }
}

}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-11 21:42:53

解封到interface{}。向下遍历嵌套对象,以找到要设置值的对象。设定值。法警回到JSON。

代码语言:javascript
复制
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的调用。

操场实例

票数 4
EN

Stack Overflow用户

发布于 2018-07-11 21:11:30

解决这个问题的一种方法是读取文件并对其进行更改。

让我们假设您有您提到的文件:

example.json

代码语言:javascript
复制
{
    "paths": {
        "/account": {
            "post": {
                "something": "body",
                "api": {
                    "uri": "http://thisiswhereineedtoedit.com"
                }
            }
        }
    }
}

我们想用"uri"来改变这条线。

您应该比我在本例中更具体,做一个占位符或什么的-以避免更改错误的行.

您可以使用类似于以下内容的小型程序:

代码语言:javascript
复制
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文件现在如下所示:

代码语言:javascript
复制
{
    "paths": {
        "/account": {
            "post": {
                "something": "body",
                "api": {
"uri": "supreme-uri"
                }
            }
        }
    }
}

希望您发现这个解决方案有用,祝您好运!

票数 1
EN

Stack Overflow用户

发布于 2022-09-30 08:28:30

你可以试试跨平面运行时的filepath pkg。您可以指定JSON路径,并获取或设置所需的结果,如上面链接中的示例所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51293840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档