go 编码/JSON:为marshal错误包含属性名称

w51jfk4q  于 4个月前  发布在  Go
关注(0)|答案(3)|浏览(37)

你正在使用的Go版本是什么(go version)?

$ go version
go version go1.10 linux/amd64

这个问题在最新的版本中是否重现?
是的

你正在使用什么操作系统和处理器架构(go env)?

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/dominic/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/dominic/dev"
GORACE=""
GOROOT="/usr/lib/go-1.10"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go-1.10/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build203824871=/tmp/go-build -gno-record-gcc-switches"

你做了什么?
当遇到使用json.Marshal()(及相关函数)时出现的错误,返回的错误没有给出在哪里遇到的错误。唯一包含的元数据是关于正在编码的值的类型的信息,但通常不足以在没有原始输入值的情况下缩小问题。(这可能并不总是手头有)

提议的内容是什么?
建议是添加marshal错误的属性名(使用点表示法表示层次结构)。例如:
json:调用MarshalJSON for type time.Time时出错:Time.MarshalJSON: year outside of range [0,9999]
将更新为更具体:
json:调用timestamp (type time.Time)时的MarshalJSON出错:Time.MarshalJSON: year outside of range [0,9999]
在更复杂/嵌套的数据结构的情况下:
json:调用events.[0].timestamp (type time.Time)时的MarshalJSON出错:Time.MarshalJSON: year outside of range [0,9999]

为什么这是有用的?
我使用Go进行大量的数据处理,通常是从第三方(即:客户)获取的,所以数据的结构通常事先不知道,更不用说由于编程错误发送的奇怪值了。
上周,我遇到了第一个上面的错误消息,需要做一些额外的工作才能确定哪个属性导致了错误,而编码器应该能够将这些信息传达给调用者。

4c8rllxm

4c8rllxm1#

我借此机会深入研究Go标准库,并希望这能成为我为该项目做出的第一个贡献。我已经在git分支上准备好了更改,可以为此创建一个PR,并且我非常愿意在此步骤之前就这个提案接受反馈。

wd2eg0qa

wd2eg0qa2#

@dominicbarnes feel free to submit a patch, either on Gerrit or on GitHub. Even if the suggestion ends up being rejected, there's no harm in posting it.

46scxncf

46scxncf3#

https://golang.org/cl/110119提到了这个问题:encoding/json: include property name for marshal errors

相关问题