json.RawMessage的元帅

前端之家收集整理的这篇文章主要介绍了json.RawMessage的元帅前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
请在这里找到代码 http://play.golang.org/p/zdQ14ItNBZ

我将JSON数据保留为RawMessage,但无法将其解码.我需要包含结构的Marshalled和Unmarshalled,但我希望仍能获得JSON字段.

码:

  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. )
  7.  
  8. type Data struct {
  9. Name string
  10. Id int
  11. Json json.RawMessage
  12. }
  13. type Data2 struct {
  14. Name string
  15. Id int
  16. }
  17.  
  18.  
  19. func main() {
  20.  
  21. tmp := Data2{"World",2}
  22.  
  23. b,err := json.Marshal(tmp)
  24. if err != nil {
  25. fmt.Println("Error %s",err.Error())
  26. }
  27. fmt.Println("b %s",string(b))
  28.  
  29. test := Data{"Hello",1,b}
  30. b2,err := json.Marshal(test)
  31. if err != nil {
  32. fmt.Println("Error %s",err.Error())
  33. }
  34.  
  35. fmt.Println("b2 %s",string(b2))
  36.  
  37. var d Data
  38. err = json.Unmarshal(b2,&d)
  39. if err != nil {
  40. fmt.Println("Error %s",err.Error())
  41. }
  42. fmt.Println("d.Json %s",string(d.Json))
  43.  
  44. var tmp2 Data2
  45. err = json.Unmarshal(d.Json,&tmp2)
  46. if err != nil {
  47. fmt.Println("Error %s",err.Error())
  48. }
  49. fmt.Println("Data2 %+v",tmp2)
  50.  
  51. }

出:

  1. b %s {"Name":"World","Id":2}
  2. b2 %s {"Name":"Hello","Id":1,"Json":"eyJOYW1lIjoiV29ybGQiLCJJZCI6Mn0="}
  3. d.Json %s "eyJOYW1lIjoiV29ybGQiLCJJZCI6Mn0="
  4. Error %s json: cannot unmarshal string into Go value of type main.Data2
  5. Data2 %+v { 0}

解决方法

json.RawMessage上的方法都采用指针接收器,这就是为什么你不能利用它们中的任何一个;你没有指针.

这在它执行的意义上“起作用”,但这可能不是你想要的策略:http://play.golang.org/p/jYvh8nHata

基本上你需要这个:

  1. type Data struct {
  2. Name string
  3. Id int
  4. Json *json.RawMessage
  5. }

然后通过程序的其余部分传播该更改.什么……你究竟想做什么?

猜你在找的JavaScript相关文章