关注开源中国很久了,但是一直没有发表过博客,原因是觉得自己能力还不够,因为这里的人们都让我仰望啊。一直在CSDN坚守着,但是,最近却总觉得那里气氛不对,遂来到了这里,来发表自己的看法,还有自己的学习笔记。
工作中使用的是go语言,其实自己学习的也不是很深入,只是勉强可以用来编几行代码,出了问题还是要跟API求救,曾设想过去读源码,但是却一直没有决心,幸好有很多testcase,提供了调用函数的方法。
花了好长时间,总是没有办法把我定义的文件decode了,把struct改了无数遍,运行testcase确实是正确的,一到我的程序就不行了。我都要打算放弃的时候,突然注意到了一件事情,示例中的Key都是大写的,我有种恍然大悟的感觉。毕竟为了简洁,go省去了好多关键字,像public,private这样的关键字都用大小写,所以,在go中,大小写应该会有不同寻常的含义。果然,把testcase中的大写改成小写,同时把定义中的大写改成小写,确实,就读不出来了,真是的,浪费了我一个下午的时间来看json的所有testcase。
除了上面说的,必须要把字段的key首字母大写外,还有一个问题也值得重视。如果把自己当成是这个方法,会去怎样解析呢?当然,要按照结构去解析,那因为json格式的数据可能顺序不是固定的,也许在某些数据项中某些key的位置也不固定,那怎样去匹配呢,通过变量名,也就是在指定这个结构的时候,将每个属性名定义为与json中的key名相同。(上述都是我猜的,没有看过源码)比如说,
[ {"Name":"alias","Age":11},{"Age":22,"Name":"lucy"}]
如果要定义与之相同的结构,
typre student struct{
Name string
Age int
}
在这里,不管是json数据的定义还是struct中的定义,凡是首字母小写就没有办法按照我们定义的结构区组织数据。
当然,我们也可以使用嵌套的,例如:
{“Age”:11,"Name":"Jessica","Course":{"Eng":85,"Math":90}}
那我们结构体的定义就可以调整为:
type score struct{
Eng int
Math int
}
type scorelist struct{
Name string
Age int
Course *score
}
对于有多条的情况,使用数组就可以了。结构体定义好之后,直接调用json的Unmarshal方法就Ok了。
第一个参数是[]byte,需要将json数据转换成byte数组,第二个参数是我们定义的结构。
有疑问加站长微信联系(非本文作者)