好厉害的 Go,跟 py 一比,简直了

2016-12-29 23:05:19 +08:00
 only0jac

就冲 golang 可以生成二进制单文件这一点,部署方便,想试试

拿 beego 练个手,用了它的 httplib 模块,其中, request 后有个直接将结果转换成 json 的,原文如下:

解析为 JSON 结构, req.ToJSON(&result) 方法

返回结构直接解析为 JSON 格式,解析到 result 对象中

我!以!为!这是和 py 的 json.loads()一样,心理窃喜,接下来……

我传了个 string ,没数据,传个空接口,没数据。。。。。

看了下源码,是直接调用的 json.Unmarshal(data, v),属于 golang 自带的库,可我一搜……

竟然发现,需要提前定义 json 的结构???而且字段首字母必须大写???不然还得声明???

WTF

beego 的 request 可以返回 string ,像 py 的 requests.get(url).text ,但是我不想这样,我想 json.loads(requests.get(url).text)

我就是想获取个 json 而已,能不能不要这么折腾人?

10646 次点击
所在节点    Go 编程语言
88 条回复
jsou
2016-12-30 08:47:02 +08:00
@only0jac
既然你 json 能定义 100 个字段,为什么就不能在 go 里定义一个包含 100 个字段的结构体呢
only0jac
2016-12-30 08:59:54 +08:00
@jsou 谢谢
kingddc314
2016-12-30 09:08:51 +08:00
静态语言就这样,要习惯,至少 Go 还有反射。当初 C/C++拼装解析 JSON 那才是一个痛苦,只是后来的 C++11 特性才好一丁点
ry_wang
2016-12-30 09:21:06 +08:00
不想定义结构体还想用着简单, https://github.com/tidwall/gjson 啊。
Immortal
2016-12-30 09:26:50 +08:00
静态语言都这样,不知道吐槽点在哪里. 既然选择了静态语言 势必要牺牲一些便携性 多写两行代码 空间换时间
而且看标题我以为是来夸 go 的...
pubby
2016-12-30 09:41:53 +08:00
我猜应该有工具能输入复杂样本自动生成结构定义的

有些比较麻烦的地方是
type JobTime time.Time

必须自己实现一遍 Marshal/Unmarshal
Citrus
2016-12-30 09:48:25 +08:00
前几楼不要乱黑啊,虽然个人不喜欢 Java ,但是 Java 反序列化 Json 还真不需要定义啊,而且有很多方法。
1. 直接反序列化成 Map<String, String> ,最粗暴,但是对某些 Json 结构支持不好
2. 直接反序列化成 JSONObject ,完美方案
pubby
2016-12-30 09:53:44 +08:00
@Citrus 还是 Gson 之类的用起来更清晰一些
only0jac
2016-12-30 10:04:54 +08:00
@ry_wang 多谢,真不错
kkk330
2016-12-30 10:08:01 +08:00
@only0jac 我的错
var v interface{}
json.Unmarshal(data , &v)
fmt.Println(v)

应该传地址
mengzhuo
2016-12-30 10:17:08 +08:00
首先,静态语言就是这样的……
100 项可以用 go generate 自动生成,首字母大写可以用
type A struct {

ST `json:"st"`
}
likexian
2016-12-30 10:20:59 +08:00
https://github.com/likexian/simplejson-go#example

楼主看这里, load json 那段
mengzhuo
2016-12-30 10:25:12 +08:00
而且不一定要定义完 result ,你需要什么数据,就定义什么好了

比如

{
"A": 1,
"B": 2,
"C": "OK",
}

你的处理函数只需要里面的 C 的话,

type Result struct {
C string
json.RawMessage
}


具体请看官方标准库, https://golang.org/pkg/encoding/json/#example_RawMessage
only0jac
2016-12-30 10:32:21 +08:00
@likexian 多谢,很方便,你博客简介亮了^_^
sampeng
2016-12-30 10:37:36 +08:00
我觉得这是是语言的哲学决定的。
golang 的开发者觉得,开发语言不能有歧义,如果是不需要定义结构体。真的,在项目里面看到各种 json 对象乱飞,都不知道哪来得时候就很痛苦。
定义结构体最大的好处是语言自文档化,光看代码就能了解整个逻辑。现在特别反感在代码里绕圈子的。简直是折磨
想想 golang 连方法重载这种特性都没有就能理解了。。
tairan2006
2016-12-30 10:37:59 +08:00
楼主你没写过静态语言么… 实际上可以用匿名 struct 的,不一定要预定义
dreamtrail
2016-12-30 11:02:25 +08:00
其实静态语言也没那么可怕,你只要写一次,以后直接复制代码修改一下就行了,虽然还是比不上脚本但也不是想象的那么麻烦。
gamexg
2016-12-30 11:56:40 +08:00
python 转 go

go 的 json 也是可以不先定义结构,但是每次使用时的检查和转换烦死人,静态类型语言都有这个问题。
不过现在觉得这是一个好的特征,只用定义好结构,然后 json 解析到结构一次就能够确定 json 符合预期,之后就不用每个字段都检查一次了。

另外搜索 generate go struct from json ,直接有在线网站提供根据 json 自动生成 go 结构,直接用即可。


python 时就已经是动态一时爽,重构火葬场了。
每次接口修改字段都需要检查很多地方,悲剧的是 ide 搜索不是找到不相关的就是漏下一些。

静态语言 ide 可以轻松找出来哪些地方引用了接口的结构。
只要确定结构定义处改了,即使有忘了的地方编译时自动报错。
magicdawn
2016-12-30 12:00:59 +08:00
C# 都有 dynamic
mathgl
2016-12-30 12:02:39 +08:00
@phrack 有部分人第一门语言是 basic pascal,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/331121

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX