我最近开始使用GIN开发Go API。我的API使用两个列从DB获取数据,其中一个列包含整数,另一个列包含一个json字符串。json字符串是动态的,因此我不能使用struct。我使用map[string]interface{}解析json并对其进行修改,然后使用json.Marshal将其解析为json。现在,我返回这个json字符串作为响应,但得到转义字符。已经对此做了一些调查,但还没有找到任何解决办法。下面是我正在使用的代码的一部分
var interface_obj map[string]interface{}
json.Unmarshal([]byte(grants.Data), &interface_obj)
grants_map := interface_obj["role_grants"].(map[string]interface{})
jsonString, err := json.Marshal(grants_map)
jsonBody := string(jsonString)之后,我将返回JSON作为GIN框架中的响应,如下所示
c.JSON(http.StatusCreated, gin.H{"message": "Json retrieved successfully", "data": jsonBody})但我得到的输出是
{
"data": "[{\"action\":\"read\",\"resource\":\"project\"},{\"action\":\"all\",\"resource\":\"users\"},{\"action\":\"all\",\"resource\":\"roles\"},{\"action\":\"all\",\"resource\":\"project-settings\"},{\"action\":\"create\",\"resource\":\"single-entity-screening\"},{\"action\":\"read\",\"resource\":\"single-entity-screening\"},{\"action\":\"create\",\"resource\":\"multi-batch-screening\"},{\"action\":\"read\",\"resource\":\"multi-batch-screening\"},{\"action\":\"read\",\"resource\":\"workspace\"},{\"action\":\"allocate\",\"resource\":\"workspace\"},{\"action\":\"update\",\"resource\":\"workspace\"},{\"action\":\"read\",\"resource\":\"case\"},{\"action\":\"allocate\",\"resource\":\"case\"},{\"action\":\"review\",\"resource\":\"case\"},{\"action\":\"update\",\"resource\":\"case\"},{\"action\":\"read\",\"resource\":\"report\"},{\"action\":\"read\",\"resource\":\"audit-trail\"},{\"action\":\"read\",\"resource\":\"delivery\"}]",
"message": "Grants retrieved successfully"
}我把它打印在我的控制台上,它看起来很好,但是在响应时引起了这个问题。有没有办法用某种标准的方法解决这个问题?请指点,谢谢
发布于 2022-08-23 14:44:16
您不需要执行json.Marshal(grants_map),只需将值直接传递给gin.H并让c.JSON执行编码,即
gin.H{... "data": grants_map}如果您手头确实有原始JSON数据,您希望将其作为其他尚未发送的JSON数据的一部分发送,则可以将其包装到json.RawMessage中,以避免“双重编码”,即
gin.H{... "data": json.RawMessage(jsonBody)}https://stackoverflow.com/questions/73460507
复制相似问题