go 在解析JSON时,遇到了一个错误:encoding/json包接受以"."(如".85")开头的浮点数,但在使用逗号标签进行解码时出现了问题,

bakd9h0s  于 2个月前  发布在  Go
关注(0)|答案(6)|浏览(50)

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

❯ go version
go version go1.12.5 darwin/amd64

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

是的

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

go env 输出

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/ashwin/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/ashwin/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.12.5/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.12.5/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
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 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/nl/_f7rxwqs2y730r18nk0shs240000gn/T/go-build739953451=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

尝试解析包含以"."开头的浮点字符串的json。
下面的Playground链接包含了3个示例:

  1. json unmarshal with ".85" --失败
  2. json unmarshal with "0.85" --成功
  3. strconv.ParseFloat ".85" --成功
    https://play.golang.org/p/q4OFvV6Asxt

你期望看到什么?

我希望使用unmarshal将".85"成功转换为浮点数
".85" -> 0.85

你看到了什么?

这个错误: json: invalid use of ,string struct tag, trying to unmarshal ".85" into float64

zc0qhyus

zc0qhyus1#

这不是有效的json。请查看数字流程图 http://json.org/

cnh2zyt3

cnh2zyt32#

但是我认为这具体是关于我们的JSON包中的,string修饰符。如果我们愿意,我们可以让它起作用,而不违反JSON语法。

mpbci0fu

mpbci0fu3#

@bradfitz / @josharian 这个需要修复吗?

q0qdq0h2

q0qdq0h24#

它正在等待一个决定。这可能需要一段时间。下个月和半个月左右肯定不会有任何代码更改。
此外,cc @mvdan

nbysray5

nbysray55#

即使使用了 ,string 修饰符,我认为它仍然应该根据 JSON 数字语法进行解析。用户依赖于语义得到明确定义,这样他们才能具体地向最终用户解释他们的服务接受哪些输入是有效的。

用户解释起来很简单:
这个字段接受一个 JSON 数字或一个包含 JSON 数字的 JSON 字符串。
而不是解释一些更晦涩的东西,比如:
这个字段接受一个 JSON 数字或一个包含根据 Go 数字语法有效的数字的 JSON 字符串。
JSON 的一个目的是它是一门与语言无关的数据交换格式,我认为在实现中泄露 Go 特定的细节是一个错误。理论上,使用 encoding/json 将 Go 服务重写为 C++、Rust、Python 等其他语言应该是可行的,而不必强制端口实现像我们解析数字这样的 Go 特定细节。

ars1skjm

ars1skjm6#

我强烈同意@dsnet的观点,我们应该拒绝这种做法。如果有人真的想要实现一种更神奇的整数字符串类型,他们总是可以使用Marshaler/Unmarshaler接口来实现。

相关问题