前些日子,写了一个项目需要用到JSON,当时查找了N多资料才有了些许我线索,为了利人利已,特此记录下来。(该项目为NET).总的来说,JSON数据是AJAX用来传递序列化对象的一种数据格式,其关键符号就是{}、[]、””、:、,几种,不能出现”,否则是不认识的。
{}里面的是一个对象,如果是多个对象,则用逗号间隔,即{},{},这样就组成了一个对象序列,为了辨别开始和结束,则需要加上[]才能进行传递,则实际传递的形式应该是[{},{}],如果只要传递一个对象,则{}的形式就可以了。接下来就是对象属性的表现方式了,属性必须在””里面,属性与值之间用:隔开,属性之间用,来分隔,如果属性的值为数组,则用[]包括起来,这样实际传递的数据格式可能有:
1、{“属性1″:值1,”属性2”:值2},如果值为字符串,则也需要用””括起来(下同)。
2、{“属性1″:值1,”属性2”:[值1,值2]},其中属性2是一个数组,包含了值1和值2。
3、{“属性1″:值1,”属性2”:{“属性a”:值a,”属性b”:[值b,值c]}},这个比较复杂了,属性2是个对象,这个对象由包含属性a和属性b,属性b又是一个数组包含值b和值c。我想这些应该是最基本了,其余的就是在此基础上的拓展而已。
实际中,要序列化对象,在.net中只要调用Newtonsoft.Json.JavaConvert.SerializeObject();函数即可,但了解JSON数据的格式标准
能更好的判断为题所在,同时能方便的按照自己的要求组成json数据。
转自:http://blog.csai.cn/user1/14586/archives/2011/46103.html
—————————————————————————————————————————————————–
举个例子:淘宝的IP地址库访问时返回的就是JSON格式(http://ip.taobao.com/instructions.php):
{“code”:0,”data”:{“ip”:”210.75.225.254″,”country”:”\u4e2d\u56fd”,”area”:”\u534e\u5317″,
“region”:”\u5317\u4eac\u5e02″,”city”:”\u5317\u4eac\u5e02″,”county”:””,”isp”:”\u7535\u4fe1″,
“country_id”:”86″,”area_id”:”100000″,”region_id”:”110000″,”city_id”:”110000″,
“county_id”:”-1″,”isp_id”:”100017″}}
可以看出,返回的结果是一个JSON对象,所以不用[]包围(当多个JSON对象时需要用[]包围)。该JSON对象有属性code和data,其中data属性的值是一个JSON对象,所以用{}包围了。淘宝IP地址库返回的ISON对象格式就是上面介绍的第三种情况。
——————————————————————————————————————————————–
python通过淘宝IP地址库获取IP位置
从上面的介绍可以看出淘宝的IP地址库返回的数据是JSON格式的数据,因此要使用python来获取IP地址信息需要分为两步:
1、构造url,并获取返回的数据。使用urllib2或urllib模块
2、解析返回的json信息。使用json模块。
当然,如果在程序中加入判断输入的ip地址是否合法的代码,需要使用re模块。
具体代码如下:
#coding=utf-8 import urllib import json def getip(ip): try: url = "http://ip.taobao.com/service/getIpInfo.php?ip="+ip ret = urllib.urlopen(url) except Exception,e: print "error:",e return data = ret.read() #下面解析数据 info = json.loads(data) if 'code' in info: if info['code'] == 0: print "ip:",info['data']['ip'] print "country:",info['data']['country'] print "area:",info['data']['area'] print "region:",info['data']['area'] print "city:",info['data']['region'] print "county:",info['data']['county'] print "isp:",info['data']['isp'] else: print "get info failed" else: print "error" if __name__ == "__main__": ip = raw_input("please enter IP:") getip(ip)
php利用淘宝ip库获得用户ip地理位置
php利用淘宝的ip接口,用来获取用户的地理位置,脚本如下:
/** * 获取用户真实 IP */ function getIP() { static $realip; if (isset($_SERVER)){ if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ $realip = $_SERVER["HTTP_X_FORWARDED_FOR"]; } else if (isset($_SERVER["HTTP_CLIENT_IP"])) { $realip = $_SERVER["HTTP_CLIENT_IP"]; } else { $realip = $_SERVER["REMOTE_ADDR"]; } } else { if (getenv("HTTP_X_FORWARDED_FOR")){ $realip = getenv("HTTP_X_FORWARDED_FOR"); } else if (getenv("HTTP_CLIENT_IP")) { $realip = getenv("HTTP_CLIENT_IP"); } else { $realip = getenv("REMOTE_ADDR"); } } return $realip; } /** * 获取 IP 地理位置 * 淘宝IP接口 * @Return: array */ function getCity($ip) { $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip; $ip=json_decode(file_get_contents($url)); if((string)$ip->code=='1'){ return false; } $data = (array)$ip->data; return $data; }
参考文献:
1、http://www.myhack58.com/Article/html/3/68/2012/35392.htm
2、http://www.odayou.com/admin-2007.html
4、python中json格式数据的编码和解码 http://www.01happy.com/python-json-encode-and-decode/