合并两个JSON字符串

问题描述:

我有我转换成JSON在老式的方式结构:合并两个JSON字符串

type Output struct { 
    Name  string `json:"name"` 
    Command string `json:"command"` 
    Status int  `json:"status"` 
    Output string `json:"output"` 
    Ttl  int  `json:"ttl,omitempty"` 
    Source string `json:"source,omitempty"` 
    Handlers []string `json:"handlers,omitempty"` 
    } 

sensu_values := &Output{ 
     Name:  name, 
     Command: command, 
     Status: status, 
     Output: output, 
     Ttl:  ttl, 
     Source: source, 
     Handlers: [handlers], 
    } 

我想读从文件系统,它可以通过被定义为任何一个任意JSON文件用户,然后将其添加到现有的JSON字符串中,从原始复制品中取出。

我该怎么做?

+3

你能解释一下你想要做什么,您遇到什么麻烦? –

+0

您可以将传入的JSON读入'map [string] interface {}',然后迭代该映射,将键与结构上的字段名进行比较,并在结果匹配的情况下分配给结构,假定值的类型断言成功。如果传入的JSON是任意的并且可以包含嵌套,则必须使用递归算法来确保您覆盖所有嵌套的键。 – evanmcdonnal

+0

所以我尽可能按照你的建议将传入的JSON读入'map [string] interface {}'中,但是后来被卡在迭代部分。 我检出了mergo库,以及一堆堆栈溢出答案等,但来自一个红宝石背景它似乎都比ruby :)难一些:) – jaxxstorm

输入JSON:

{ 
    "environment": "production", 
    "runbook": "http://url", 
    "message": "there is a problem" 
} 

这是更好地解编输入JSON和编组Output结构之前,将二者结合起来的结构。

示例代码

inputJSON := `{"environment": "production", "runbook":"http://url","message":"there is a problem"}` 
out := map[string]interface{}{} 
json.Unmarshal([]byte(inputJSON), &out) 

out["name"] = sensu_values.Name 
out["command"] = sensu_values.Command 
out["status"] = sensu_values.Status 

outputJSON, _ := json.Marshal(out) 

Play Link

+0

根据要求,我有一个应用程序:https://github.com/jaxxstorm/sensu-wrapper它允许用户建立一个JSON字符串,并将其发送到套接字或标准输出。 我指定任意JSON的原因是因为每个用户都有不同的字段,他们可能想要通过监控检查发送。如果他们是固定的字段,我认为它会很容易,但任意的JSON和打字似乎很困难! – jaxxstorm

+0

你可以在问题中添加任意输入json的样本吗?是的,任意的JSON可能难以在Go中处理。 –

+0

一个例子是:'{“environment”:“production”,“runbook”:“http:// url”,“message”,“有问题”} – jaxxstorm