【问题标题】:Correctly remove second json.Marshal in Go正确删除 Go 中的第二个 json.Marshal
【发布时间】:2017-12-24 23:52:36
【问题描述】:

无论出于何种原因,我在尝试使用 MySQL 存储在 Go 中构建一个简单的 Rest API 时,添加了第二个 json.Marshal,它是双重编码并产生带有转义引号等的结果。我可以去掉引号,但我认为我不应该首先发生两个 json.Marshal 事情。

问题是双重的 - 1) 哪个适合删除(倾向于第一个,因为“结果”应该是更大的数组)和 2)如何在删除后保持代码正常运行?当我开始遇到各种错误时,我不能简单地删除第一个。以下是代码的相关部分:

type Volume struct {
    Id int
    Name string
    Description string
}

...跳过....

var result = make([]string,1000)
switch request.Method {
    case "GET":

        name  := request.URL.Query().Get("name")

        stmt, err := db.Prepare("select id, name, description from idm_assets.VOLUMES where name = ?")
            if err != nil{
                fmt.Print( err );
            }

            rows, err := stmt.Query(name)

            if err != nil {
                fmt.Print( err )
            }

            i := 0

            for rows.Next() {
                var name string
                var id int
                var description string
                err = rows.Scan( &id, &name, &description )
                if err != nil {
                    fmt.Println("Error scanning: " + err.Error())
                        return
                }
                volume := &Volume{Id: id,Name:name,Description: description}

这里是第一个 json.Marshal ...

                b, err := json.Marshal(volume)
                    fmt.Println(b)
                if err != nil {
                    fmt.Println(err)
                    return
                }
                result[i] = fmt.Sprintf("%s", string(b))
                i++
            }
        result = result[:i]

...跳过 PUT、DELETE 等其他情况。到第二个 json.Marshal ...

default:
    }
json, err := json.Marshal(result)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Fprintf(response,"'%v'\n",string(json) )

【问题讨论】:

    标签: mysql json rest go


    【解决方案1】:

    result变成*Volume的数组

    result := []*Volume{}
    

    然后追加新的Volume 记录:

    result = append(result, &Volume{Id: id,Name:name,Description: description})
    

    最后使用Marshal(result) 得到 JSON 结果。

    【讨论】:

    • 非常感谢。这绝对让我朝着正确的方向前进。我之前曾尝试附加到切片,但做错了,直到与此进行比较才能看到错误。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多