如何创建一个嵌套字典来发送数据?

huangapple go评论110阅读模式
英文:

How to create a nested dictionary to post data?

问题

{
"data": {
"payload": {
"from": {
"phone_number": "+XXXXXXXXXX"
},
"to": {
"phone_number": "+XXXXXXXXXX"
}
}
}
}

我正在尝试创建一个嵌套字典作为请求体。我尝试使用struct,但结果不如预期,并且在使用map[string]interface{}{}时出现错误。

  1. 结构体 Route:
  1. type Payload struct {
  2. From struct {
  3. PhoneNumber string `json:"phone_number"`
  4. }
  5. To struct {
  6. PhoneNumber string `json:"phone_number"`
  7. }
  8. }
  9. type Response struct {
  10. Data struct {
  11. Payload Payload `json:"payload"`
  12. }
  13. }
  14. func main() {
  15. // 其他代码
  16. payload := Payload{
  17. From: struct{ PhoneNumber string }{PhoneNumber: sender},
  18. To: struct{ PhoneNumber string }{PhoneNumber: recipient},
  19. }
  20. response := Response{
  21. Data: struct{ Payload Payload }{Payload: payload},
  22. }
  23. fmt.Println(response)
  24. }

上述代码的输出结果为:

  1. {{{{+XXXXXXXXXX} {+XXXXXXXXXX}}}}
  1. 创建原始字典:
  1. var payload = map[string]interface{}{
  2. "from": map[string]string{
  3. "phone_number": sender,
  4. },
  5. "to": map[string]string{
  6. "phone_number": recipient,
  7. },
  8. }
  9. fmt.Println(payload)
  10. var response = map[string]interface{}{
  11. "data": map[string]interface{}{
  12. "payload": payload,
  13. },
  14. }

错误信息: 无法将类型为map[string]interface{}的'payload'用作类型为string的值。

如果你能指导我正确的方向,我将非常感激。

英文:
  1. {
  2. "data": {
  3. "payload": {
  4. "from": {
  5. "phone_number": "+XXXXXXXXXX"
  6. },
  7. "to": {
  8. "phone_number": "+XXXXXXXXXX",
  9. },
  10. }
  11. }
  12. }

I'm trying to create a nested dictionary for the post body. I've tried using struct but it didn't work as I expected and while using the map[string]interface{}{} I'm getting an error.

  1. Struct Route:
  1. type Payload struct {
  2. From struct {
  3. PhoneNumber string `json:"phone_number"`
  4. }
  5. To struct {
  6. PhoneNumber string `json:"phone_number"`
  7. }
  8. }
  9. type Response struct {
  10. Data struct {
  11. Payload Payload `json:"payload"`
  12. }
  13. }
  14. func main() {
  15. // extra code
  16. payload := Payload{
  17. From: struct {PhoneNumber string `json:"phone_number"`}(struct{ PhoneNumber string }{PhoneNumber: sender}),
  18. To: struct {PhoneNumber string `json:"phone_number"`}(struct{ PhoneNumber string }{PhoneNumber: recipient})}
  19. response := Response{Data: struct {
  20. Payload Payload `json:"payload"`
  21. }(struct{ Payload Payload }{Payload: payload})}
  22. fmt.Println(response)
  23. }

The above response is:

  1. {{{{+XXXXXXXXXX} {+XXXXXXXXXX}}}}
  1. Raw dict creation:
  1. var payload = map[string]interface{}{}
  2. payload["from"].(map[string]string)["phone_number"] = sender
  3. payload["to"].(map[string]string)["phone_number"] = recipient
  4. fmt.Println(payload)
  5. var response = map[string]interface{}{}
  6. response["data"].(map[string]string)["payload"] = payload

Error: Cannot use 'payload' (type map[string]interface{}) as the type string

I would highly appreciate it if you could guide me in the correct direction

答案1

得分: 2

最简单的方法是使用JSON转Go结构体,生成一个类似的结构体:

  1. type AutoGenerated struct {
  2. Data Data `json:"data"`
  3. }
  4. type From struct {
  5. PhoneNumber string `json:"phone_number"`
  6. }
  7. type To struct {
  8. PhoneNumber string `json:"phone_number"`
  9. }
  10. type Payload struct {
  11. From From `json:"from"`
  12. To To `json:"to"`
  13. }
  14. type Data struct {
  15. Payload Payload `json:"payload"`
  16. }

然后可以使用以下示例:

  1. outStruct := AutoGenerated{
  2. Data: Data{
  3. Payload: Payload{
  4. From: From{PhoneNumber: sender},
  5. To: To{PhoneNumber: recipient},
  6. },
  7. },
  8. }
  9. out, err := json.Marshal(outStruct)
  10. fmt.Println(string(out), err)

这将输出:

  1. {"data":{"payload":{"from":{"phone_number":"234234"},"to":{"phone_number":"32434"}}}} <nil>
英文:

The simplest way is to use the Convert JSON to Go struct, that generate a struct like:

  1. type AutoGenerated struct {
  2. Data Data `json:&quot;data&quot;`
  3. }
  4. type From struct {
  5. PhoneNumber string `json:&quot;phone_number&quot;`
  6. }
  7. type To struct {
  8. PhoneNumber string `json:&quot;phone_number&quot;`
  9. }
  10. type Payload struct {
  11. From From `json:&quot;from&quot;`
  12. To To `json:&quot;to&quot;`
  13. }
  14. type Data struct {
  15. Payload Payload `json:&quot;payload&quot;`
  16. }

and use, as example:

  1. outStruct := AutoGenerated{
  2. Data: Data{
  3. Payload: Payload{
  4. From: From{PhoneNumber: sender},
  5. To: To{PhoneNumber: recipient},
  6. },
  7. },
  8. }
  9. out, err := json.Marshal(outStruct)
  10. fmt.Println(string(out), err)

this will out

  1. {&quot;data&quot;:{&quot;payload&quot;:{&quot;from&quot;:{&quot;phone_number&quot;:&quot;234234&quot;},&quot;to&quot;:{&quot;phone_number&quot;:&quot;32434&quot;}}}} &lt;nil&gt;

答案2

得分: 1

这是你的代码的一个工作示例。当你尝试创建一个原始的映射时,我认为你给nil映射赋值了一个值,这就是为什么你会得到错误的原因。

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. type (
  7. Response struct {
  8. Data Data `json:"data"`
  9. }
  10. Data struct {
  11. PayLoad PayLoad `json:"payload"`
  12. }
  13. PayLoad struct {
  14. From Address `json:"from"`
  15. To Address `json:"to"`
  16. }
  17. Address struct {
  18. PhoneNumber string `json:"phone_number"`
  19. }
  20. )
  21. func main() {
  22. payload := PayLoad{
  23. From: Address{PhoneNumber: "+1xxxxxxxxx"},
  24. To: Address{PhoneNumber: "+1xxxxxxxxx"},
  25. }
  26. resp := Response{
  27. Data: Data{
  28. PayLoad: payload,
  29. },
  30. }
  31. j, _ := json.Marshal(resp)
  32. fmt.Println(string(j))
  33. // with map
  34. var payloadNew = map[string]interface{}{
  35. "from": map[string]interface{}{
  36. "phone_number": "+1xxxxxxxx",
  37. },
  38. "to": map[string]interface{}{
  39. "phone_number": "+1yyyyyyyy",
  40. },
  41. }
  42. var responseNew = map[string]interface{}{
  43. "data": map[string]interface{}{
  44. "payload": payloadNew,
  45. },
  46. }
  47. j, _ = json.Marshal(responseNew)
  48. fmt.Println(string(j))
  49. }

JSON输出为:

  1. {"data":{"payload":{"from":{"phone_number":"+1xxxxxxxxx"},"to":{"phone_number":"+1xxxxxxxxx"}}}}
  2. {"data":{"payload":{"from":{"phone_number":"+1xxxxxxxx"},"to":{"phone_number":"+1yyyyyyyy"}}}}
英文:

Here is a working example of your code. When you were trying to create a raw map I think you were assigning value to nil map that's why you were getting error.

  1. package main
  2. import (
  3. &quot;encoding/json&quot;
  4. &quot;fmt&quot;
  5. )
  6. type (
  7. Response struct {
  8. Data Data `json:&quot;data&quot;`
  9. }
  10. Data struct {
  11. PayLoad PayLoad `json:&quot;payload&quot;`
  12. }
  13. PayLoad struct {
  14. From Address `json:&quot;from&quot;`
  15. To Address `json:&quot;to&quot;`
  16. }
  17. Address struct {
  18. PhoneNumber string `json:&quot;phone_number&quot;`
  19. }
  20. )
  21. func main() {
  22. payload := PayLoad{
  23. From: Address{PhoneNumber: &quot;+1xxxxxxxxx&quot;},
  24. To: Address{PhoneNumber: &quot;+1xxxxxxxxx&quot;},
  25. }
  26. resp := Response{
  27. Data: Data{
  28. PayLoad: payload,
  29. },
  30. }
  31. j, _ := json.Marshal(resp)
  32. fmt.Println(string(j))
  33. // with map
  34. var payloadNew = map[string]interface{}{
  35. &quot;from&quot;: map[string]interface{}{
  36. &quot;phone_number&quot;: &quot;+1xxxxxxxx&quot;,
  37. },
  38. &quot;to&quot;: map[string]interface{}{
  39. &quot;phone_number&quot;: &quot;+1yyyyyyyy&quot;,
  40. },
  41. }
  42. var responseNew = map[string]interface{}{
  43. &quot;data&quot;: map[string]interface{}{
  44. &quot;payload&quot;: payloadNew,
  45. },
  46. }
  47. j, _ = json.Marshal(responseNew)
  48. fmt.Println(string(j))
  49. }

The json outputs are:

  1. {&quot;data&quot;:{&quot;payload&quot;:{&quot;from&quot;:{&quot;phone_number&quot;:&quot;+1xxxxxxxxx&quot;},&quot;to&quot;:{&quot;phone_number&quot;:&quot;+1xxxxxxxxx&quot;}}}}
  2. {&quot;data&quot;:{&quot;payload&quot;:{&quot;from&quot;:{&quot;phone_number&quot;:&quot;+1xxxxxxxx&quot;},&quot;to&quot;:{&quot;phone_number&quot;:&quot;+1yyyyyyyy&quot;}}}}

huangapple
  • 本文由 发表于 2021年8月30日 15:27:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/68980328.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定