Rows to map to JSON using sqlx package

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

Rows to map to JSON using sqlx package

问题

尝试将结果转换为JSON字符串时,由于没有表示数据的结构体,我必须使用MapScan。以下是我所做的:

  1. import (
  2. "fmt"
  3. "log"
  4. "encoding/json"
  5. _ "github.com/jmoiron/sqlx"
  6. _ "github.com/go-sql-driver/mysql"
  7. )
  8. func main() {
  9. db, err := sqlx.Connect("mysql", "uname:pwd@/db")
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. m := map[string]interface{}{}
  14. // 遍历行
  15. rows, err := db.Queryx("SELECT id,cname FROM items")
  16. for rows.Next() {
  17. err := rows.MapScan(m)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. }
  22. // 将map转换为JSON
  23. b, _ := json.Marshal(m)
  24. // 打印结果的JSON
  25. fmt.Printf("Marshalled data: %s\n", b)
  26. }

输出结果为Marshalled data: {"cname":"c29tZWl0ZW0","id":"MA=="},但应该是Marshalled data: {"cname":"someitem","id":0}。我不确定如何解决这个问题,因为返回的值是以base64编码的,有什么想法吗?

英文:

Trying to get the result into a JSON string, I have to use MapScan because i have no structs that represent the data so here is what i did

  1. import (
  2. "fmt"
  3. "log"
  4. "encoding/json"
  5. _ "github.com/jmoiron/sqlx"
  6. _ "github.com/go-sql-driver/mysql"
  7. )
  8. func main() {
  9. db, err := sqlx.Connect("mysql", "uname:pwd@/db")
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. m := map[string]interface{}{}
  14. //Go through rows
  15. rows, err := db.Queryx("SELECT id,cname FROM items")
  16. for rows.Next() {
  17. err := rows.MapScan(m)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. }
  22. //Marshal the map
  23. b, _ := json.Marshal(m)
  24. //Prints the resulted json
  25. fmt.Printf("Marshalled data: %s\n", b)
  26. }

The output is Marshalled data: {"cname":"c29tZWl0ZW0","id":"MA=="}

and it should be Marshalled data: {"cname":"someitem","id":0}

and I am not sure how to go around this since the values returned in base64 encodig, any ideas?

答案1

得分: 4

只需在遍历地图之前对base64字符串进行解码,然后再进行地图的编组:

  1. import (
  2. "encoding/base64"
  3. "encoding/json"
  4. "log"
  5. )
  6. for k, encoded := range m {
  7. decoded, err := base64.StdEncoding.DecodeString(encoded)
  8. if err != nil {
  9. log.Fatal("error:", err)
  10. }
  11. m[k] = decoded
  12. }
  13. b, _ := json.Marshal(m)

你需要在导入部分添加这行代码:"encoding/base64"

英文:

Just iterate over your map and decode the base64 strings prior to marshal the map:

  1. for k, encoded := range m {
  2. decoded, err := base64.StdEncoding.DecodeString(encoded)
  3. if err != nil {
  4. log.Fatal("error:", err)
  5. }
  6. m[k] = decoded
  7. }
  8. b, _ := json.Marshal(m)

You must add this to your imports : "encoding/base64".

huangapple
  • 本文由 发表于 2014年7月15日 15:56:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/24752814.html
匿名

发表评论

匿名网友

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

确定