2015-12-09 51 views
3
{ 
    "query": { 
    "query_string": { 
     "query": "<query string>" 
    } 
    } 
} 

我使用的API要求我以這種格式發送我的查詢。我一直在試圖找到一種方法來創建這個使用地圖,但我一直在收到錯誤,並沒有能夠找到任何解決方案在線。如何在Golang中創建這個這個JSON對象?

編輯:我找到了一個辦法,有沒有更好的辦法?

test := map[string]map[string]map[string]string { 
     "query": map[string]map[string]string { 
      "query_string": map[string]string{ 
       "query": query, 
      }, 
     }, 
    } 
+1

你可以使用地圖或結構。你嘗試了什麼,以及你收到了哪些錯誤? – JimB

回答

3

在Go中,您可以解組爲多種不同的結構。最含糊的是interface{}。我建議不要這樣做,因爲你放棄了任何實際類型安全的機會。另一個極端是使用結構,例如json,它們看起來像這樣;

type Wrapper struct { 
    Query Query `json:"query"` 
} 

type Query struct { 
    QueryString QueryString `json:"query_string"` 
} 

type QueryString struct { 
    Query string `json:"query"` 
} 

東西在中間,給你們例如JSON是一個map[string]map[string]map[string]。如果您不知道如何使用encoding/json軟件包,請查看此處的示例。 https://golang.org/pkg/encoding/json/#example_Unmarshal

這是非常簡單的,如果你有你輸入一個[]byte,然後你實例的類型要解組成,你可以叫json.Unmarhsal(jsonBytes, &ThingToUnmarshalInto)

編輯:基於霍布斯的評論看來你」實際上是試圖讓該json發送到服務器。在這種情況下,使用上面的結構。另一個答案中提供的示例演示了您需要的一切。除了你打電話給json.Marshal帶有你想要轉換成json字符串的實例,而不是將json字符串作爲[]byte並將它傳遞給unmarshal以獲得結構。我錯誤地認爲你正在接收那個json,而不是試圖形成它。

+1

這不是關於解組的問題。 – hobbs

+0

@ hobbs好,我認爲你是對的。我會更新OP。無論如何,我已經給了他大部分必要的東西。 – evanmcdonnal

2

下面是使用map方法和struct方法的Play的示例。

正如你所看到的,如果你需要發送一次這樣的請求,地圖表格通常會減少代碼量,並且更加清晰。

如果請求中存在大量嵌套或共享類型,則結構形式往往會更具性能,並且可能更清晰。如果你最終走結構路線,你可能會想要類似evanmcdonnal的答案。爲了簡潔起見,我在這裏使用了匿名結構。

package main 

import "encoding/json" 
import "log" 

type M map[string]interface{} 

type Query struct { 
    Query struct { 
     QueryString struct { 
      Query string `json:"query"` 
     } `json:"query_string"` 
    } `json:"query"` 
} 

func main() { 
    b, err := json.Marshal(M{"query": M{"query_string": M{"query": "query goes here"}}}) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    log.Println(" As Map:", string(b)) 


    var q Query 
    q.Query.QueryString.Query = "query in a struct" 
    b, err = json.Marshal(q) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    log.Println("As Struct:", string(b)) 
} 
1

Anonymous Struct是Go的一個很好的功能之一。這是一個相當於圍棋structJSON得到封/取消封送/從使用編碼/ JSON包:

type MyType struct { 
    Query struct { 
     QueryString struct { 
      Query string `json:"query"` 
     } `json:"query_string"` 
    } `json:"query"` 
} 

是的,你可以只使用一個類型的變量,而不會引入新的類型(如果這適用於你的情況):

var myVar struct { 
    Query struct { 
     QueryString struct { 
      Query string `json:"query"` 
     } `json:"query_string"` 
    } `json:"query"` 
}