凤凰平台注册开户_凤凰彩票app下载安装_凤凰彩票投注网

热门关键词: 凤凰平台注册开户,凤凰彩票app下载安装,凤凰彩票投注网

爬虫系列

作者: 编程知识  发布:2019-11-24

本文实例陈述了PHP管理JSON字符串key缺乏引号的消除形式,分享给大家供大家参谋之用。具体方法如下:

数组转对象:

4. json.load()

读取文件中json方式的字符串成分 转变成python类型

    # json_load.py

    import json

    strList = json.load(open("listStr.json"))
    print strList

    # [{u'city': u'u5317u4eac'}, {u'name': u'u5927u5218'}]

    strDict = json.load(open("dictStr.json"))
    print strDict
    # {u'city': u'u5317u4eac', u'name': u'u5927u5218'}
 string "fdipzone" }$str1 = '{name:"fdipzone"}';var_dump(json_decode; // NULL?>

JSON基于三种结构

import json

消除措施:判别是还是不是留存贫乏双引括起来的key,如贫乏则先用正则替换为"key",再开展json_decode操作。

$json = '{"number": 12345678901234567890}';
print_r(json_decode($json));
/*
 stdClass Object
(
    [number] => 1.2345678901235E+19
)
 */

print_r(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));
/*
stdClass Object
(
    [number] => 12345678901234567890
)
 */

JsonPath与XPath语法比较:

Json结构清晰,可读性高,复杂度低,特别轻松相配,下表中对应了XPath的用法。

XPath JSONPath 描述
/ $ 根节点
. @ 现行节点
/ .or[] 取子节点
.. n /a 取父节点,Jsonpath未支持
// .. 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
@ n/a 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要。
[] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
[,] 支持迭代器中做多选。
[] ?() 支持过滤操作.
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持

可望本文所述对大家PHP程序设计的上学抱有利于。

PHP 5.3.3 +

2.json.dumps()

达成python类型转化为json字符串,重临二个str对象 把三个Python对象编码转变来Json字符串

从python原始类型向json类型的中转对照如下:

凤凰彩票app下载安装 1

image.png

    # json_dumps.py
    import json
    import chardet

    listStr = [1, 2, 3, 4]
    tupleStr = (1, 2, 3, 4)
    dictStr = {"city": "北京", "name": "大猫"}

    json.dumps(listStr)
    # '[1, 2, 3, 4]'
    json.dumps(tupleStr)
    # '[1, 2, 3, 4]'

    # 注意:json.dumps() 序列化时默认使用的ascii编码
    # 添加参数 ensure_ascii=False 禁用ascii编码,按utf-8编码
    # chardet.detect()返回字典, 其中confidence是检测精确度

    json.dumps(dictStr) 
    # '{"city": "\u5317\u4eac", "name": "\u5927\u5218"}'

    chardet.detect(json.dumps(dictStr))
    # {'confidence': 1.0, 'encoding': 'ascii'}

    print json.dumps(dictStr, ensure_ascii=False) 
    # {"city": "北京", "name": "大刘"}

    chardet.detect(json.dumps(dictStr, ensure_ascii=False))
    # {'confidence': 0.99, 'encoding': 'utf-8'}

chardet是二个要命理想的编码识别模块,可经过pip安装

 string "fdipzone" }$str1 = '{name:"fdipzone"}';var_dump(ext_json_decode; // array { ["name"]=> string "fdipzone" }?>

PHP对变量实行 JSON 编码

JSON

json轻巧说正是javascript中的对象和数组,所以这二种结构便是目的和数组二种结构,通过这二种结构得以表示各类复杂的组织

1.对象:对象在js中代表为{ }括起来的原委,数据结构为 { key:value, key:value, ... }的键值对的协会,在面向对象的言语中,key为指标的习性,value为对应的属性值,所以超级轻巧驾驭,取值方法为 对象.key 获取属性值,那些属性值的品种能够是数字、字符串、数组、对象这几种。

2.数组:数组在js中是中括号[ ]括起来的剧情,数据结构为 ["Python", "javascript", "C++", ...],取值情势和兼具语言中相通,使用索引获取,字段值的档期的顺序能够是 数字、字符串、数组、对象三种。

但假诺json字符串的key缺乏双引括起来,则json_decode会失败。

展现方式

示例:

大家以智联合招生聘城市JSON文件 http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例,获取具备城市。

    # jsonpath_lagou.py

    import urllib2
    import jsonpath
    import json
    import chardet

    url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'
    request =urllib2.Request(url)
    response = urllib2.urlopen(request)
    html = response.read()

    # 把json格式字符串转换成python对象
    jsonobj = json.loads(html)

    # 从根节点开始,匹配name节点
    citylist = jsonpath.jsonpath(jsonobj,'$..name')

    print citylist
    print type(citylist)
    fp = open('city.json','w')

    content = json.dumps(citylist, ensure_ascii=False)
    print content

    fp.write(content.encode('utf-8'))
    fp.close()

平日来说来讲,JSON字符串是key:value方式的字符串,符合规律key是由双引号括起来的。

字符串(string卡塔 尔(英语:State of Qatar)是由双引号包围的即兴数量Unicode字符的集合,使用反斜线转义。四个字符(character卡塔尔国即四个单独的字符串(character string卡塔尔国。

3 json.dump()

将Python内置类型种类化为json对象后写入文件

    # json_dump.py

    import json

    listStr = [{"city": "北京"}, {"name": "大刘"}]
    json.dump(listStr, open("listStr.json","w"), ensure_ascii=False)

    dictStr = {"city": "北京", "name": "大刘"}
    json.dump(dictStr, open("dictStr.json","w"), ensure_ascii=False)
JSON_HEX_TAG (integer)
所有的 < 和 > 转换成 u003C 和 u003E。  PHP 5.3.0 +
JSON_HEX_AMP (integer)
所有的 & 转换成 u0026。 PHP 5.3.0 +
JSON_HEX_APOS (integer)
所有的 ' 转换成 u0027。 PHP 5.3.0 +
JSON_HEX_QUOT (integer)
所有的 " 转换成 u0022。 PHP 5.3.0 +
JSON_NUMERIC_CHECK (integer)
将所有数字字符串编码成数字(numbers)。 PHP 5.3.3 +
...

1.json.loads()

把Json格式字符串解码转变到Python对象 从json到python的种类转变对照如下:

凤凰彩票app下载安装 2

image.png

    # json_loads.py

    import json

    strList = '[1, 2, 3, 4]'

    strDict = '{"city": "北京", "name": "大猫"}'

    json.loads(strList) 
    # [1, 2, 3, 4]

    json.loads(strDict) # json数据自动按Unicode存储
    # {u'city': u'u5317u4eac', u'name': u'u5927u732b'}

函数:json_encode()

注意事项:

json.loads() 是把 Json格式字符串解码转变到Python对象,假设在json.loads的时候出错,要静心被解码的Json字符的编码。

假设传入的字符串的编码不是UTF-8的话,供给钦点字符编码的参数 encoding

dataDict = json.loads(jsonStrGBK);
  • dataJsonStr是JSON字符串,若是其编码本人是非UTF-8的话而是GBK 的,那么上述代码会招致出错,改为相应的:

              dataDict = json.loads(jsonStrGBK, encoding="GBK");
    
  • 借使dataJsonStr通过encoding钦定了适宜的编码,不过中间又富含了其余编码的字符,则须求先去将dataJsonStr调换为Unicode,然后再指确定人员编制码格式调用json.loads()

             ``` python
    

dataJsonStrUni = dataJsonStr.decode("GB2312"); dataDict = json.loads(dataJsonStrUni, encoding="GB2312");

    ##字符串编码转换

    这是中国程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的。
    其实编码问题很好搞定,只要记住一点:

    ####任何平台的任何编码 都能和 Unicode 互相转换

    UTF-8 与 GBK 互相转换,那就先把UTF-8转换成Unicode,再从Unicode转换成GBK,反之同理。



    ``` python 
    # 这是一个 UTF-8 编码的字符串
    utf8Str = "你好地球"

    # 1. 将 UTF-8 编码的字符串 转换成 Unicode 编码
    unicodeStr = utf8Str.decode("UTF-8")

    # 2. 再将 Unicode 编码格式字符串 转换成 GBK 编码
    gbkData = unicodeStr.encode("GBK")

    # 1. 再将 GBK 编码格式字符串 转化成 Unicode
    unicodeStr = gbkData.decode("gbk")

    # 2. 再将 Unicode 编码格式字符串转换成 UTF-8
    utf8Str = unicodeStr.encode("UTF-8")

decode的功用是将此外编码的字符串转变到 Unicode 编码

encode的作用是将 Unicode 编码调换来别的编码的字符串

一句话:UTF-8是对Unicode字符集进行编码的风流倜傥种编码方式

数组:

JsonPath

JsonPath 是生机勃勃种新闻抽出类库,是从JSON文书档案中抽取钦点新闻的工具,提供各类语言完成版本,包蕴:Javascript, Python, PHP 和 Java。

JsonPath 对于 JSON 来说,相当于 XPATH 对于 XML。

下载地址:https://pypi.python.org/pypi/jsonpath

设置情势:点击Download URL链接下载jsonpath,解压之后施行python setup.py install

官方文书档案:http://goessner.net/articles/JsonPath

服务端设置 header 头允许AJAX跨域:

浮点值类型保持:

数组在js中是中括号“[]”括起来的剧情,数据结构为["java","javascript","php",...]。

对象:

$obj = new StdClass();
$obj->body = 'another post';
$obj->id = 21;
$obj->approved = true;
$obj->favorite_count = 1;
$obj->status = null;
echo json_encode($obj);
// {"body":"another post","id":21,"approved":true,"favorite_count":1,"status":null}

凤凰彩票app下载安装,大整型数值:

输出中文JSON对象

$arr = [
    '张三',
    '李四',
    '王五'
];
echo json_encode($arr);
// ["u5f20u4e09","u674eu56db","u738bu4e94"]
echo json_encode($arr, JSON_UNESCAPED_UNICODE);
// ["张三","李四","王五"]

能够在率性标识之间增加空白。

输出JSON到JavaScript程序;

数组(array) 是值(value)的有序集合。四个数组以“[”(左中括号卡塔尔开首,“]”(右中括号卡塔尔国甘休。值时期利用“,”(逗号卡塔尔国分隔。

$arr = [
    1,
    2,
    3
];
echo json_encode($arr);
// [1,2,3]
echo json_encode((object)$arr);
// {"0":1,"1":2,"2":3}
echo json_encode($arr, JSON_FORCE_OBJECT);
// {"0":1,"1":2,"2":3}

json轻松说正是javascript中的对象和数组,所以那三种结构正是目的和数组二种结构。

解码json:

$arr = [
    12.3,
    99.99,
    100.0
];
echo json_encode($arr);
// [12.3,99.99,100]
echo json_encode($arr, JSON_PRESERVE_ZERO_FRACTION);
// [12.3,99.99,100.0]

函数:json_decode()

//中文,json对象
$arr = [
    '张三',
    '李四',
    '王五'
];
echo json_encode($arr);
// ["u5f20u4e09","u674eu56db","u738bu4e94"]
echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
// {"0":"张三","1":"李四","2":"王五"}

服务端代码

JSON验证:

万般方式:

JSON的数值未有使用八进制与十四进制格式。

什么是JSON

值的有序列表(An ordered list of values)。在大好多言语中,它被完毕为数组(array),矢量(vector),列表(list),序列(sequence)

header('Content-type:text/json');  
或者
header('content-type:application/json;charset=utf8');    
  • 1 JSON(JavaScript Object Notation) 是风华正茂种轻量级的数据交流格式。
  • 2 比较轻巧的进展阅读和编排。
  • 3 方便了机械举行解析和浮动。
  • 4 选取完全部独用立于程序语言的文本格式。

对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号卡塔 尔(阿拉伯语:قطر‎开首,“}”(右括号卡塔 尔(英语:State of Qatar)截止。每一种“名称”后跟叁个“:”(冒号卡塔 尔(阿拉伯语:قطر‎;“‘名称/值’ 对”之直接纳“,”(逗号卡塔尔分隔。

“名称/值”对的集合(A collection of name/value pairs)。不一样的编程语言中,它被精通为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)

json解码:

出口普通话JSON:

对象在js中象征为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构。

此外的掩码:

以字面编码多字节 Unicode 字符(默许是编码成 uXXXX)。 PHP 5.4.0 +

$arr = [
    'a' => 1,
    'b' => 2,
    'c' => 3,
    'd' => 4,
    'e' => 5
];
echo json_encode($arr);

解码为数组:

对象转json:

function isValidJson($strJson) { 
    json_decode($strJson); 
    return (json_last_error() === JSON_ERROR_NONE); 
} 
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

//解码json
var_dump(json_decode($json));
/*
object(stdClass)[1]
  public 'a' => int 1
  public 'b' => int 2
  public 'c' => int 3
  public 'd' => int 4
  public 'e' => int 5
*/

JSON_BIGINT_AS_STRING, 用于将大整数转为字符串而非默许的float类型。

header('Content-Type: text/javascript; charset=utf8');
//如果需要设置允许所有域名发起的跨域请求,可以使用通配符 *
header('Access-Control-Allow-Origin: http://www.test.com/');
//表明该响应的有效时间为 86400 秒,也就是 24 小时。
header('Access-Control-Max-Age: 86400 ');
//服务器允许客户端使用指定方法发起请求
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

//转成数组
var_dump(json_decode($json, true));
/*
array (size=5)
  'a' => int 1
  'b' => int 2
  'c' => int 3
  'd' => int 4
  'e' => int 5
 */

值(value卡塔尔国能够是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这么些构造能够嵌套。

本文由凤凰平台注册开户发布于编程知识,转载请注明出处:爬虫系列

关键词: