解组时跳过对Unicode字符串的解码:golang
我有一个JSON:解组时跳过对Unicode字符串的解码:golang,go,unicode,Go,Unicode,我有一个JSON: { "code":"\u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d" } 这个结构呢 type Text struct { Code string } 如果我使用json.Unmarshal或NewDecoder.Decode中的任何一个,Unicode将转换为实际的中文。所以Text.Code是 在丰德尔贝罗舒适的1.房单位 我不希望它转换,我想要相同的unicode字
{
"code":"\u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d"
}
这个结构呢
type Text struct {
Code string
}
如果我使用json.Unmarshal或NewDecoder.Decode中的任何一个,Unicode将转换为实际的中文。所以Text.Code是
在丰德尔贝罗舒适的1.房单位
我不希望它转换,我想要相同的unicode字符串。您可以使用自定义解码器进行转换
您可以使用自定义解码器执行此操作 您可以使用json.RawMessage而不是字符串 您可以使用json.RawMessage而不是字符串
简单的解决方案是通过在反斜杠前面加上另一个反斜杠来避免反斜杠
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
}
简单的解决方案是通过在反斜杠前面加上另一个反斜杠来避免反斜杠
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
}
当unicode字符在JSON文件中未转义时,是否也需要转义?如果JSON文件如下所示:{代码:在丰德尔贝罗舒适的1.房单位}当unicode字符没有在JSON文件中转义时,您是否也需要转义它们?例如,如果JSON文件如下所示:{code:在丰德尔贝罗舒适的1.房单位}感谢您的回复,我们在PHP中有一些服务想要使用相同的数据,我已经实现了适用于我的自定义MarshalJSON。谢谢。刚刚发现了一个小问题,它在字符串中添加了双引号。当您打印r.代码时,您可以看到带有的字符串。我尝试修剪数组内部的第一个和最后一个字节e解组JSON并成功。但我不确定这是否是正确的解决方案。@RanveerSingh您可以尝试使用un解组器RawUnicodeStringb[1:lenb-1]应该可以。谢谢你的回复,我们在PHP中有一些服务想要使用相同的数据,我已经实现了适合我的自定义MarshalJSON。谢谢。刚刚发现了一个小问题,它在字符串中添加了双引号。当你打印r.代码时,你可以看到字符串。我试图修剪字符串的第一个和最后一个字节解组JSON中的e数组。但我不确定这是否是正确的解决方案。@RanveerSingh您可以尝试使用解组器RawUnicodeStringb[1:lenb-1]应该可以工作。
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
}