防止Go的json.Marshal将字符串强制转换为有效的UTF-8 Unicode?

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

Prevent Go's json.Marshal from coercing string to valid UTF-8 unicode?

问题

我正在尝试使用Go将一些JSON数据POST到服务器,其中特殊字符如“&”必须在发送的JSON字符串中保持不变。

Go的json.Marshal会将某些字符转换为Unicode,这是很好的:

字符串值被编码为JSON字符串,强制转换为有效的UTF-8,用Unicode替换无效的字节。角括号“<”和“>”被转义为“\u003c”和“\u003e”,以防止某些浏览器将JSON输出误解为HTML。同样出于这个原因,和号“&”也被转义为“\u0026”。

听起来可能有些荒谬,但我发送的JSON是用于使用RESTful端点执行数据库查询的,其中这个字面字符串将用于执行自由文本数据库查询-因此我不能使用Unicode,因为它会被直接解释。

那么有没有办法阻止这种转换为Unicode?还是我只能在编组完成后撤消这些替换?

谢谢

英文:

I'm trying to POST some JSON to a server using Go where special characters like ampersand must exist intact in the JSON string I'm sending.

http://play.golang.org/p/bPt9kl88-y

package main

import (
    &quot;fmt&quot;
    &quot;encoding/json&quot;
)

func main() {

    type TransactionStatement struct {
	    Query      string                 
    }

    statement := &amp;TransactionStatement{
    	Query:       &quot;my query with this &amp; that&quot;,
    }
    data, _ := json.Marshal(statement)

    fmt.Printf(&quot;&gt; %v&quot;, string(data))
}

Go's json.Marshal is converting certain characters like '&' to unicode. Which is great:

> String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode replacement rune. The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e" to keep some browsers from misinterpreting JSON output as HTML. Ampersand "&" is also escaped to "\u0026" for the same reason.
> Blockquote

It may sound rediculous but the JSON I'm sending is for a database query using a RESTful endpoint, where this literal string will be used to perform a freetext database query - so I can't use unicode since it's interpreted literally.

So is there any way to prevent this conversion to unicode? Or will I just have to undo these replacements after the marshaling is done?

Thanks

答案1

得分: 5

你可以选择不进行编码,如果你愿意的话:
https://golang.org/pkg/encoding/json/#Encoder.SetEscapeHTML

https://play.golang.org/p/gfy1WaDrEIH

英文:

You can choose not to encode if you wish:
https://golang.org/pkg/encoding/json/#Encoder.SetEscapeHTML

https://play.golang.org/p/gfy1WaDrEIH

答案2

得分: 2

我刚刚意识到,在发布后,其他字符也被编码为Unicode,并且这些字符确实有效。

英文:

I just realized after posting other characters are getting encoded to unicode as well and those are indeed working.

huangapple
  • 本文由 发表于 2015年3月4日 22:35:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/28857123.html
匿名

发表评论

匿名网友

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

确定