今天一个朋友说自己怎么解都解不了服务器发来的JSON格式的数据,用SBJson,我接触这个东西补长,但是还是有一点了解,所以就帮他看了结果出现因为他的字符串里有换行符导致SBJson解析出错。最后他的解决方案是换成了TouchJson 问题解决了,那么下面我也谈谈对Json的经验。
JSON是JavaScript Object Notation的简称,那其实JSON是为了传输JavaScript对象用的,后来常用在网络数据交互上使用,由于他的格式化比Xml简单,因为是明字符串,所以比字节码更容易查找错误,所以最近几年的网络交互上基本都用它。
JSON标准数据只有7种,object、array、string、number、ture、false、null.当然由于字符串可以表示类型挺多的,所以在很多平台都有很多的扩展数据,所以有时候在android上能解析,而放到ios上无法解析,这是因为了用了不规范的JSON照成的,所以大家在适应多平台的多语言开发的时候千万别搞功能化,最高使用标准化的东西。
Object其实是{name:value,…,name:value}的模式,为什么这么表示的,我不知道你们还记得对象的解释,重要的一条是数据的封装,至于行为的封装这里就没什么关系,因为行为是不用保存起来的,行为只是一个过程,他任何时候都执行一样的逻辑(别纠结细节),所以这里的name其实就是你成员变量的名字,value就是变量的值,这个在java的class字节码也是这种原理的。而很多时候我们其实把这个name:value变成key:value,因为很多时候不是为了转成一个对象,而是存在一个·Dictionary或则HashTable或则MapSet等一些Key-Value相关的数据结构里。这里要注意的是,有时候我们的Key其实只能是String,,也就是说结构是String:Value,官方的标准也是String:Value,因为表示的变量名,但是很多JSON库是Object:Object,而Objective-c中这个Object一般转成Dictionary,而Dictionary的key只能是String,直接不得不多提一下,为什么Dictionary的key只能是String,是因为Dictionary用的是Hashing的存储方式,这种方式我叫做位置替代法,就是为了坚决更快的查找对象,由于通过key hashcode来确定他的保存位置,当然这里的算法也是比较复杂,主要的避免重复和重复了怎么办,这里就不讨论了。而String的HashCode比较容易分辨,这就是只能使用String的原因,所以很多java转过的JSON无法在Objective-c上解析其实也是这个原因,大家要注意了。
Array,数组对象,JSON格式是[value,…,value],数据其实代表的所有跟集合有关的数据都可以这么表示。
String,字符串对象,JSON格式是”chars”,这里要注意的是如果字符串里边有字符串需要双串表示,也就是\\”chars\\”,如果里边有换行需要使用转移字符“\n”,标准里边是不能包含真的回车换行,但是其实很多库也支持,为了不带来必要的麻烦请不要这么做。
其他都没什么好讲了。