javascript
1 JSON.parse() 方法用于将一个 JSON 字符串转换为对象。
JSON.parse(text[, reviver])
text:必需, 一个有效的 JSON 字符串。
reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
var a = “{\'a\':1,\'b\':2}”
经 JSON.parse(a)得到:
{\'a\':1,\'b\':2}
2 JSON.stringify() 方法用于将 JavaScript值(对象)转换为 JSON 字符串
JSON.stringify(value[, replacer[, space]])
var a={\'a\':1, \'b\':2}
经 JSON.stringify(a)得到:
“{\'a\':1,\'b\':2}”
python
http://axiaoxin.com/article/77/
在Python中最常用到的json处理函数通常是json.dumps()和json.loads(),他们和json.dump()和json.load()的区别在于后者是对一个类文件对象(如StringIO)进行写入/读取,而前者是对字符串进行读写,参数都一样。
1 load()和loads() 字符串->Python的json对象
有一个很有用的参数object_pairs_hook。loads后是无法保证json_data原始顺序的,如果想要保留原有的顺序,那么就需要用到object_pairs_hook。
from collections import OrderedDict
import json
json_data = \'{"q": 1, "r": 4, "e": 3, "w": 2}\'
json.loads(json_data)
{u\'e\': 3, u\'q\': 1, u\'r\': 4, u\'w\': 2}
json.loads(json_data, object_pairs_hook=OrderedDict)
OrderedDict([(u\'q\', 1), (u\'r\', 4), (u\'e\', 3), (u\'w\', 2)])
2 dump()和dumps() Python json对象->字符串
skipkeys: 默认为False,作用是判断字典的key,如果key不是基本类型(str, unicode, int, long, float, bool, None),在dumps的时候就会报TypeError错。若为True,那么遇到不合法key的时候就会跳过。
data = {1: 1, \'a\': \'a\', None: None, (0, 0): \'bad\'}
json.dumps(data, skipkeys=True)
\'{"a": "a", "1": 1, "null": null}\'
json.dumps(data)
#TypeError: keys must be a string
ensure_ascii: 默认为True,所有的非ascii字符在输出时都会被转义为\uxxxx的序列,返回的对象是一个只由ascii字符组成的str类型,为False时不会进行转义输出,反回的对象是个unicode。(这个参数对包含中文的json输出时非常有用)
data = {u\'我\': u\'是\', u\'美\': u\'女\'}
json.dumps(data)
\'{"\\u6211": "\\u662f", "\\u7f8e": "\\u5973"}\'
json.dumps(data, ensure_ascii=False)
u\'{"\u6211": "\u662f", "\u7f8e": "\u5973"}\'
print json.dumps(data)
{"\u6211": "\u662f", "\u7f8e": "\u5973"}
print json.dumps(data, ensure_ascii=False)
{"我": "是", "美": "女"}
indent: 设置对json进行pretty-printed的缩进空格数
print json.dumps(data, ensure_ascii=False, indent=0)
{
"我": "是",
"美": "女"
}
print json.dumps(data, ensure_ascii=False, indent=4)
{
"我": "是",
"美": "女"
}
separators: 默认值为(\', \', \': \'),第一个元素为item的分隔符,第二个是key和value的分隔符。separators=(\',\', \':\')可以用来去掉json中的空格来压缩json
print json.dumps(data, ensure_ascii=False, separators=(\',\', \':\'))
{"我":"是","美":"女"}
print json.dumps(data, ensure_ascii=False)
{"我": "是", "美": "女"}
print json.dumps(data, ensure_ascii=False, separators=(\'+\', \'-\'))
{"我"-"是"+"美"-"女"}
sort_key: 默认是False,即不对进行排序操作
data = {\'q\': 1, \'w\': 2, \'e\': 3, \'r\': 4}
print json.dumps(data, ensure_ascii=False, sort_keys=False)
{"q": 1, "r": 4, "e": 3, "w": 2}
print json.dumps(data, ensure_ascii=False, sort_keys=True)
{"e": 3, "q": 1, "r": 4, "w": 2}
处理中文json时,要想不每次都给一堆重复的参数,可以用partial
import json
from functools import partial
json_dumps = partial(json.dumps, ensure_ascii=False, sort_keys=True)
中文测试
json_dumps("呵呵")
\'"\xe5\x91\xb5\xe5\x91\xb5"\' # unicode
json.dumps("呵呵")
\'"\\u5475\\u5475"\' # ascii
json_dumps("呵呵").decode(\'utf-8\') # unicode -> utf-8
u\'"\u5475\u5475"\'
json.dumps("呵呵").decode(\'utf-8\') # ascii -> utf-8
u\'"\\u5475\\u5475"\'
print json_dumps("呵呵").decode(\'utf-8\')
"呵呵"
print json.dumps("呵呵").decode(\'utf-8\') # 让大家苦恼的大概就是这个,因为她原本就不是unicode
"\u5475\u5475"
flask
在Flask中直接return一个dumps的json字符串其实这样并不合理,因为这样返回的content-type是text/html,而json的content-type应该是application/json
有两种方法在flask中返回正确json,一种是使用flask的jsonify,他会在dumps的时候自动为你加上content-type,或者手动的显式在response中指定mimetype
from flask import jsonify
@router
def view():
return jsonify(*arg, **kwargs)
# or return Response(response=json_data, mimetype="application/json")
用jsonify很省事,但是在有中文的时候就坑爹了,可以在app的配置中设置app.config[\'JSON_AS_ASCII\'] = False来输出unicode