JSON,采用Unicode或二进制格式的响应

时间:2019-06-27 12:15:53

标签: python json

任何人都可以帮助我理解这一段:

•JSON和XML对Unicode字符串(即,人类可读的文本)有很好的支持,但是它们不支持二进制字符串(不包含字节的字节序列) 字符编码)。二进制字符串是一个有用的功能,因此人们可以绕开 通过使用Base64将二进制数据编码为文本来解决此限制。该架构是 然后用于指示该值应解释为Base64编码。 可以,但是有点黑,将数据大小增加了33%

例如,如果我了解得很好,我会在设备上使用REST API来获取有关python的一些信息。 对于每个响应,它都采用JSON格式,并且采用unicode格式。 那么好吧 但是我不太了解二进制字符串的故事。 每个字符不是UTF8格式的事实吗? 为什么我的设备不响应​​以字节编码而不是Unicode编码的JSON?

2 个答案:

答案 0 :(得分:0)

JSON规范无法原生表示二进制数据,它仅支持ASCII和Unicode编码的数据。 Base64 Encoding通过在base 64中用ASCII字符表示所有字节,提供了一种将任意二进制数据表示为ASCII数据的方法。要从使用base64编码的JSON读取二进制对象,必须首先decode it

这里是在base64中将python泡菜对象编码为打包在json负载中的示例。

import json
import base64
import pickle

binary_data = pickle.dumps([1,2,3])  # Binary python Pickle Object
encoded = base64.b64encode(binary_data).decode()  # UTF-8 String Representation
payload = {"binary_object": encoded}
my_json_object = json.dumps(payload)
print(my_json_object)
# Prints: {"binary_object": "gANdcQAoSwFLAksDZS4="}

read_data = json.loads(my_json_object)  # Read Json Data in
my_list_pickle = base64.b64decode(read_data["binary_object"])  # Decode Base64 Object
my_list = pickle.loads(my_list_pickle)  # Load Pickle Object
print(my_list)
# Prints: [1, 2, 3]

至于为什么您的应用程序不响应您想要的格式,我不知道,因为您没有提供应用程序。

答案 1 :(得分:0)

JSON和XML是文本格式。它们被设计为易于人们阅读,使用viemacsedlin之类的典型文本编辑器进行显示和操纵,使用适合平台的任何字符编码方案。但是,所有正在使用的字符编码方案都有一些不允许代表字符的数据模式-例如,它们可能具有指示“字符串结尾”的模式。

如果要在JSON或XML中包含完全任意的数据,则需要一种方法以有效的文本字符串对该数据进行编码,并指示该文本不是您要使用的实际数据。 Base64是进行编码的一种方法,通常用于此目的。缺点是在写入或读取数据时进行编码和解码的开销,编码的文本字符串比原始任意二进制数稍大,并且必须记住进行编码和解码。