在解组时跳过解码Unicode字符串:golang

时间:2016-07-27 19:24:15

标签: go unicode

我有这个JSON:

{
    "code":"\u5728\u4e30\u5fb7\u5c14Berro\u8212\u9002\u76841\u623f\u5355\u4f4d"
}

这个结构

type Text struct {
    Code string
}

如果我使用json.UnmarshalNewDecoder.Decode中的任何一个,则Unicode将转换为实际的中文。所以Text.Code

在丰德尔Berro舒适的1房单位

我不希望它转换,我想要相同的unicode字符串。

3 个答案:

答案 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
}

https://play.golang.org/p/Ok9IVJnxp-8