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))())
待续......