首页 > 解决方案 > 由于编码,Unmarshal 返回空白对象

问题描述

我正在尝试解组原始json字符串。编码似乎有错误,但我无法弄清楚。

包主

import (
    "encoding/json"
    "fmt"
    "log"
)

type Foo struct {
    Transmission string `json:"transmission"`
    Trim         string `json:"trim"`
    Uuid         string `json:"uuid"`
    Vin          string `json:"vin"`
}

func main() {

    var foo Foo

    sample := `{
        "transmission": "continuously\x20variable\x20automatic",
        "trim": "SL",
        "uuid" : "6993e4090a0e0ae80c59a76326e360a1",
        "vin": "5N1AZ2MH6JN192059"
    }`

    err := json.Unmarshal([]byte(sample), &foo)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(foo)

}

2009/11/10 23:00:00 字符串转义码中的无效字符“x”

如果传输条目被删除,它会起作用。

这是一个工作操场

标签: go

解决方案


您的输入不是有效的 JSON。JSON规范指出

除了必须转义的代码点外,所有代码点都可以放在引号内:引号 (U+0022)、反斜线 (U+005C) 和控制字符 U+0000 到 U+001F。

此外,虽然有两个字符的转义序列,\x但不是其中之一,因此它被 Go 解析器正确解释为无效的转义序列。如果你想在你的 JSON 中有一个反斜杠文字,它需要\\在 JSON 输入本身中表示。查看示例的修改版本:https: //play.golang.org/p/JZdPJGpPR5q

(请注意,这不是您的 Go 字符串文字的问题,因为您已经在使用原始 ( ``) 字符串文字 - JSON 本身需要有两个反斜杠。)


推荐阅读