zoukankan      html  css  js  c++  java
  • python3处理不标准json数据

    keywords: python json
    source: http://txw1958.cnblogs.com/

    先看下JSON的语法规则:

    JSON 语法规则
    JSON 语法是 JavaScript 对象表示法语法的子集。

    • 数据在名称/值对中
    • 数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组

    JSON 名称/值对
    JSON 数据的书写格式是:名称/值对。
    名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

    "firstName" : "John"

    这很容易理解,等价于这条 JavaScript 语句:

    firstName = "John"

    JSON 值
    JSON 值可以是:

    • 数字(整数或浮点数)
    • 字符串(在双引号中)
    • 逻辑值(true 或 false)
    • 数组(在方括号中)
    • 对象(在花括号中)
    • null

    现在有这样一个数据,如下所示:

    {
        url: 'http://txw1958.cnblogs.com',
        uid: 100000
    }
    

    它的key不带引号,另外url的值 http://txw1958.cnblogs.com 是单引号,不是双引号
    在网站 http://jsonlint.com/ 使用JSON验证器 验证一下,第一个错误就是url不是string类型,不认识你老人家

    Results  
    Parse error on line 1:
    {    url: 'http: //txw195
    -----^
    Expecting 'STRING', '}'

    下面这条语句可以将这样的不规则json转换成规则的dict格式

    eval(blog, type('Dummy', (dict,), dict(__getitem__=lambda s,n:n))())

    看结果

    U:>python3
    Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    >>> blog = '''
    ... {
    ...     url: 'http://txw1958.cnblogs.com',
    ...     uid: 100000
    ... }
    ... '''
    >>>
    >>> type(blog)
    <class 'str'>
    >>>
    >>> agent = eval(blog, type('Dummy', (dict,), dict(__getitem__=lambda s,n:n))())
    >>>
    >>> type(agent)
    <class 'dict'>
    >>>
    >>> agent
    {'url': 'http://txw1958.cnblogs.com', 'uid': 100000}
    >>>

    分析

    eval(blog, type('Dummy', (dict,), dict(__getitem__=lambda s,n:n))())

    待续......

  • 相关阅读:
    hive同环比实现
    hive中的to_date和to_char
    正则表达式匹配一个独立的字符
    Mysql Explain用法详解
    hadoop安装踩坑
    hadoop ssh localhost无密码登录
    Node.js第十二篇:图片随机验证码
    Node.js第十一篇:Koa框架基础
    Ajax第五篇:JQuery中使用Ajax
    Ajax第四篇:跨域JSONP、CORS
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468203.html
Copyright © 2011-2022 走看看