2016-11-08 162 views
2

我有我轉換成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

回答

2

輸入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