好厉害的 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 而已,能不能不要这么折腾人?

10401 次点击
所在节点    Go 编程语言
88 条回复
Allianzcortex
2016-12-29 23:10:07 +08:00
Go 是静态语言,在解析 JSON 上是没有 Python 有优势的
phrack
2016-12-29 23:26:29 +08:00
难道你第一门语言是 py 不是 c ´・ᴗ・`
icedx
2016-12-29 23:33:09 +08:00
其实就是一个入乡随俗的道理
顺便 Python 是鸭子类型
这是没有这个特性的语言比不了的
choury
2016-12-29 23:33:15 +08:00
你是没用过 C , java 这些吧
scnace
2016-12-29 23:42:38 +08:00
试试解析到 map 里面(嘿嘿嘿
TheCure
2016-12-29 23:45:02 +08:00
simplejson
defia
2016-12-29 23:45:13 +08:00
可以 map[string]interface{}吧
gouchaoer
2016-12-29 23:45:57 +08:00
静态语言里不如 rust
nicevar
2016-12-29 23:47:27 +08:00
哈哈,如果让你用 c 来处理 json 会不会上吊了
only0jac
2016-12-29 23:51:35 +08:00
@phrack 其实第一门是 basic

@choury 用过 c#,记得 java 也不用先自己声明 json 字段啊

@scnace
@defia 能否细说一下?


@callofmx 这个是 beego 自带的,没用其他库,要是我自己写的话就去找方便的了

@nicevar 还真没试过
Tyanboot
2016-12-29 23:59:14 +08:00
scnace
2016-12-30 00:02:12 +08:00
就是不用`struct`的形式了 而是采用`map[string]interface{}`的形式呀。然后`Unmarshal`之后 map 的 key(string)就是 json 的 key map 的 value 就是 json 的 value 惹 。 但是 我还是建议解析到 struct 的 代码可维护性会强很多(不要问我怎么知道的
Tyanboot
2016-12-30 00:03:41 +08:00
@Tyanboot 不好意思手抖按到回复了…
我觉得看库的实现吧
c#有个 NewtonJson 。也是需要先有个定义好的类来做载体,才能解析到定义好的类的实例上。也就是需要先声明 JSON 的字段格式。

但是 c++是有个 jsoncpp 的库,不需要定义 JSON 的格式,用起来要舒服不少。
messyidea
2016-12-30 00:08:14 +08:00
limhiaoing
2016-12-30 00:20:07 +08:00
json 反序列化成 struct 难道不是很方便的功能吗,而且一般不会强制要求必须定义结构体。这个能力一般都是用反射来实现的,楼上说的 C++现阶段要实现并不容易,可能至少需要静态反射标准化后才能做到。 rust 之前用过一个 json 库也有这个特性,不知道是怎么实现的。
soli
2016-12-30 00:27:15 +08:00
知足吧。

别说 JSON ,你用 C 拼个字符串试试。
eyp82
2016-12-30 00:29:46 +08:00
python 党笑而不语
reus
2016-12-30 00:32:44 +08:00
定义一个结构体很麻烦吗?

var data struct {
// xxx
}

定义变量的时候就可以定义 struct ,或者说 go 的 struct 可以是匿名的

在静态类型语言里, go 处理 json 是最方便的了,因为有 reflection

别用什么 map[string]interface{},处理嵌套的结构你就知道了

var data struct {
List []struct{
Info struct {
// xxx
}
}
}

你用 map[string]interface{}试试?类型转换烦死你。

再说回来,想学 go 就直接学标准库,别像学 py 一样,上来就框架。 go 的标准库功能比 py 的强得多,根本不需要 beego 这种东西。
kkk330
2016-12-30 00:35:33 +08:00
- 函数签名是 json.Unmarshal(data []byte , v interface{})
- 也就是说 lz 你想简单点就直接

```go
data := []byte("{"a":"a", "b": 1}")
var v interface{}
json.Unmarshal(data , v)
fmt.Println(v)
```
jsq2627
2016-12-30 00:35:52 +08:00
@Tyanboot 你说的只是 newtonjson 的一种早期强类型用法。现在是可以反序列化成 dynamic 类型,或者 jtoken 类型配合 linq 很方便。
虽然我没用过 go 但我觉得一定存在一种不需要预先定义 schema 的使用方式的。

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

https://www.v2ex.com/t/331121

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

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

© 2021 V2EX