我有这个JSON:
{
"code":"\u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d"
}
这个结构
type Text struct {
Code string
}
如果我使用json.Unmarshal
或NewDecoder.Decode
中的任何一个,则Unicode将转换为实际的中文。所以Text.Code
是
在丰德尔Berro舒适的1房单位
我不希望它转换,我想要相同的unicode字符串。
答案 0 :(得分:4)
您可以使用自定义解码器https://play.golang.org/p/H-gagzJGPI
执行此操作package main
import (
"encoding/json"
"fmt"
)
type RawUnicodeString string
func (this *RawUnicodeString) UnmarshalJSON(b []byte) error {
*this = RawUnicodeString(b)
return nil
}
func (this RawUnicodeString) MarshalJSON() ([]byte, error) {
return []byte(this), nil
}
type Message struct {
Code RawUnicodeString
}
func main() {
var r Message
data := `{"code":"\u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d"}`
json.Unmarshal([]byte(data), &r)
fmt.Println(r.Code)
out, _ := json.Marshal(r)
fmt.Println(string(out))
}
答案 1 :(得分:0)
您可以使用json.RawMessage
代替字符串。 https://play.golang.org/p/YcY2KrkaIb
package main
import (
"encoding/json"
"fmt"
)
type Text struct {
Code json.RawMessage
}
func main() {
data := []byte(`{"code":"\u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d"}`)
var message Text
json.Unmarshal(data, &message)
fmt.Println(string(message.Code))
}
答案 2 :(得分:0)
简单的解决方案是在反斜杠前面加上另一个反斜杠来逃避反斜杠。
func main() {
var jsonRawOriginal json.RawMessage = []byte(`"\u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d"`)
var jsonRawEscaped json.RawMessage = []byte(strings.Replace(string(jsonRawOriginal), `\u`, `\\u`, -1))
fmt.Println(string(jsonRawOriginal)) // "\u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d"
fmt.Println(string(jsonRawEscaped)) // "\\u5728\\u4e30\\u5fb7\\u5c14Berro\\u8212\\u9002\\u76841\\u623f\\u5355\\u4f4d"
var a interface{}
var b interface{}
json.Unmarshal(jsonRawOriginal, &a)
json.Unmarshal(jsonRawEscaped, &b)
fmt.Println(a) // 在丰德尔Berro舒适的1房单位
fmt.Println(b) // \u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d
}