JSON数据如何通过HTTP按字节传输

JSON数据如何通过HTTP按字节传输,json,http,protocols,mime-types,Json,Http,Protocols,Mime Types,由于HTTP是一种文本协议,我假设对于所有mime类型,HTTP主体通常由文本组成。这意味着对于JSON,所有数字都将表示为文本,每个字符有1个字节,而不是8个字节 例如,对于传输此JSON: { num: 0.123456789 } 它将为数字值单独传输11个字节 这是正确的还是有针对不同mime类型的优化字节表示,尤其是HTTP中的JSON?我建议您将它们作为字符串发送;它将花费您1字节的字符,并且不会受到其他系统精度的影响。我建议您将它们作为字符串发送;它将花费您1字节的字符,并且不会受

由于HTTP是一种文本协议,我假设对于所有mime类型,HTTP主体通常由文本组成。这意味着对于JSON,所有数字都将表示为文本,每个字符有1个字节,而不是8个字节

例如,对于传输此JSON:

{ num: 0.123456789 }
它将为数字值单独传输11个字节


这是正确的还是有针对不同mime类型的优化字节表示,尤其是HTTP中的JSON?

我建议您将它们作为字符串发送;它将花费您1字节的字符,并且不会受到其他系统精度的影响。

我建议您将它们作为字符串发送;它将花费您1字节的字符,并且不会受到其他系统精度的影响。

HTTP是一种基于文本的协议,但这主要是关于消息的标题部分。然后,标题应该通过内容长度定义正文大小,例如,对于稍微复杂一点的“Transfer Encoding:chunked”模式,这个大小是字节大小

正文内容可以包含任何字节,即使是空字节(如果需要的话),无论如何,对于HTTP代理来说,正文只是一个n字节长的blob

这个主体甚至可以通过gzip或deflate进行压缩,然后这些信息也存储在头文件中

因此,以UTF-8或任何其他非ascii7格式(如所有iso-*格式)传输json是没有问题的


就正文的大小而言,UTF-8之类的东西不会使“每个字节都变大”,因为像数字这样的简单内容实际上是1字节长的字符,即使在UTF-8中也是如此。如果您想知道消息的大小,那么真正重要的设置是HTTP服务器可以在正文上应用的压缩格式。

HTTP是一种基于文本的协议,但这主要是关于消息的标题部分。然后,标题应该通过内容长度定义正文大小,例如,对于稍微复杂一点的“Transfer Encoding:chunked”模式,这个大小是字节大小

正文内容可以包含任何字节,即使是空字节(如果需要的话),无论如何,对于HTTP代理来说,正文只是一个n字节长的blob

这个主体甚至可以通过gzip或deflate进行压缩,然后这些信息也存储在头文件中

因此,以UTF-8或任何其他非ascii7格式(如所有iso-*格式)传输json是没有问题的


就正文的大小而言,UTF-8之类的东西不会使“每个字节都变大”,因为像数字这样的简单内容实际上是1字节长的字符,即使在UTF-8中也是如此。如果您想知道消息的大小,那么真正重要的设置是HTTP服务器可以在正文上应用的压缩格式。

HTTP可以发送二进制数据,特别有两种方法可以优化此设置:

您可以切换到二进制编码,该编码不是JSON,但在很大程度上与JSON兼容。CBOR就是一个例子。 您可以使用gzip或brotli压缩JSON。浏览器透明地支持这一点。
选择2是迄今为止最简单的,实际上给了你一个巨大的冲击。但是选项1通常在发送字节的效率方面获胜,并且可以与选项2结合使用。

HTTP可以很好地发送二进制数据,特别有两种方法可以优化这一点:

您可以切换到二进制编码,该编码不是JSON,但在很大程度上与JSON兼容。CBOR就是一个例子。 您可以使用gzip或brotli压缩JSON。浏览器透明地支持这一点。
选择2是迄今为止最简单的,实际上给了你一个巨大的冲击。但选项1通常在发送字节的效率方面获胜,并且可以与选项2结合使用。

FWIW,HTTP正文也可以是二进制的,而无需任何额外的编码/包装。例如,这就是图像的发送方式。是的,JSON是以UTF-8编码文本的形式发送的。所以你的数字需要11个字节。如果您不喜欢这样,请查看诸如MessagePack see之类的压缩编码。但是,除非你有大量的数据,否则就不值得麻烦了。@Thilo从个人角度来看,这似乎不太值得,但在全球范围内,这是一种巨大的浪费。。如果浏览器能够发出支持某种二进制json的信号,那就太好了,例如,通过新的压缩,服务器只需发送一个更优化的字节表示。浏览器确实支持gzip压缩,这对JSON也有很大帮助。FWIW,HTTP正文也可以是二进制的,无需任何额外的编码/包装。例如,这就是图像的发送方式。是的,JSON是以UTF-8编码文本的形式发送的。所以你的数字需要11个字节。如果您不喜欢这样,请查看诸如MessagePack see之类的压缩编码。但是,除非你有大量的数据,否则就不值得麻烦了。@Thilo从个人角度来看,这似乎不太值得,但在全球范围内,这是一种巨大的浪费。。如果浏览器能够发出支持某种二进制json的信号,那就太好了,例如,通过一个新的压缩,服务器将只发送一个更优化的字节表示。浏览器支持gzip压缩

Session对JSON也有很大的帮助。谢谢你的回答,我实际上并没有寻找任何特定问题的解决方案,但我想确保我正确理解协议。但是为什么你需要这么小的数字?如果你不使用BigDecimal很难保持这种精度。这与精度无关,我只是想知道是否真的有这么多内存,带宽和最终的能量浪费在json的文本表示上。我通常在数字上使用字符串,不需要数学运算,或者在几个步骤中可能会发生变化。谢谢你的回答,我实际上并不是在寻找任何特定问题的解决方案,而是想确保我正确理解了协议。但为什么需要这么小的数字呢?如果你不使用BigDecimal很难保持这种精度。这与精度无关,我只是想知道是否真的有这么多内存,带宽和最终的能量浪费在json的文本表示上。我通常在不需要数学运算的数字上使用字符串,或者在几个步骤中可能会发生变化。我不是说UTF-8会膨胀ASCII文本,我的意思是,作为JSON中所有数字的双精度数字不是用8个字节表示的,而是这个数字的字符串表示形式中的字符数。我刚刚读到,在不属于封闭生态系统的系统之间交换的JSON文本必须用UTF-8编码,我认为这意味着序列化的JSON数字在UTF-8中也将作为文本。UTF-8与是否为文本无关,而是关于字符的内部011011表示。一切都是一个字符,甚至是一个数字。编码是低级的,json中的类型是非常高级的。是的,但我想知道通过HTTP传输的json数字的字节表示是否是UTF-8编码字符,或者是IEEE 754 floats。好的,解决方案是json没有复杂的字节,json是一种文本基格式,使用UTF-8。如果我们更深入一点,在HTTP层,HTTP不关心主体的编码,或者至少如果您希望在消息的另一端使用正确的编码对其进行解码,您应该添加正确的内容编码头,否则,试图读取它的HTTP客户端可能会使用错误的编码并导致正文解释失败。我不是说UTF-8会膨胀ASCII文本,我的意思是,作为JSON中所有数字的双精度数字不是用8个字节表示的,而是这个数字的字符串表示形式中的字符数。我刚刚读到,在不属于封闭生态系统的系统之间交换的JSON文本必须用UTF-8编码,我认为这意味着序列化的JSON数字在UTF-8中也将作为文本。UTF-8与是否为文本无关,而是关于字符的内部011011表示。一切都是一个字符,甚至是一个数字。编码是低级的,json中的类型是非常高级的。是的,但我想知道通过HTTP传输的json数字的字节表示是否是UTF-8编码字符,或者是IEEE 754 floats。好的,解决方案是json没有复杂的字节,json是一种文本基格式,使用UTF-8。如果我们更深入,在HTTP层,HTTP不关心正文的编码,或者至少如果您希望在消息的另一端使用正确的编码对其进行解码,那么您应该添加正确的内容编码头,否则试图读取它的HTTP客户端可能使用错误的编码并导致正文解释失败。