初识JSON

json模块是python自带的一个模块。里面有一些很好用的函数。

json.dump()

json.dump()函数,这个函数用来将数据存储到JSON文件中。

1
2
3
4
5
>>> import json
>>> numbers = [1,2,2,5]
>>> filename = 'numbers.json'
>>> with open(filename, 'w') as f_obj:
... json.dump(numbers, f_obj)

得到的结果

1
[1, 2, 2, 5]


json.load

同样使用load将JSON文件中的数据读出来

1
2
3
4
5
6
7
8
>>> import json
>>> with open('numbers.json', 'r') as f_obj:
... numbers = json.load(f_obj)
...
>>> numbers
[1, 2, 2, 5]
>>> type(numbers)
<class 'list'>

这样做的好处就是在不同的程序之间共享数据。


json.dumps()

这个函数的作用是将Python对象编码成Json字符串。

1
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

举例子:

1
2
3
4
5
6
7
8
9
>>> data = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
>>> type(data)
<class 'dict'>
>>> import json
>>> json.dumps(data)
'{"a": 1, "e": 5, "b": 2, "c": 3, "d": 4}'
>>> json_obj = json.dumps(data)
>>> type(json_obj)
<class 'str'>

data是字典类型的,我们使用json模块中的dumps()函数将data转换成json字符串,转换后的对象从根本上来说还是字符串类型。


Django中的JsonResponse

1
class JsonResponse(data,encoder = DjangoJSONEncoder,safe = True,json_dumps_params = None,** kwargs)

HttpResponse 的一个子类,用户帮助创建JSON 编码的响应。它从父类继承大部分行为,并具有以下不同点:

  • 它的默认Content-Type 头部设置为application/json。

  • 它的第一个参数data,应该为一个dict 实例。如果safe参数设置为False,它可以是任何可JSON 序列化的对象。

  • encoder,默认为 django.core.serializers.json.DjangoJSONEncoder,用于序列化data。关于这个序列化的更多信息参见JSON 序列化

  • 布尔参数safe 默认为True。如果设置为False,可以传递任何对象进行序列化(否则,只允许dict 实例)。如果safe 为True,而第一个参数传递的不是dict 对象,将抛出一个TypeError。

  • json_dumps_params参数是传递给用于生成响应的json.dumps()调用的关键字参数的字典。

举个例子,在向后端传输JSON字符串的时候:

1
2
3
4
5
6
7
8
9
10
# 我要学习表单配置
class AdduserwantView(View):
def post(self, request):
userwant_form = UserWantForm(request.POST)
if userwant_form.is_valid():
userwant_form.save(commit=True)
return HttpResponse(JsonResponse({'status':'success'}), content_type='application/json')
else:
return HttpResponse(JsonResponse({'status':'fail', 'msg':'添加出错'}), content_type='application/json')

或者直接上官方文档的例子:

1
2
3
4
>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
b'{"foo": "bar"}'

首先JsonResponse()第一个参数是一个字典形式的,此时safe默认是True,但是得到的response的contant是二进制类型的,这点不是很清楚。

未完待续……