javascript - 使用 application/json 优于 text/plain 的优势

使用内容类型 application/json 通过 text/plain 发送序列化为 json 的对象是否有任何性能优势?

我知道许多框架(如 Spring)可以根据内容类型映射和序列化数据,但总的来说,我发现这个过程很简单,因此使用 application/jsontext/plain 上用于 JSON 对象。

例子:

xhr.setRequestHeader("Content-type","text/plain");
// or
xhr.setRequestHeader("Content-type","application/json");
xhr.send(JSON.stringify({"foo": "bar"}));

最佳答案

假设您正在讨论使用 JSON 与自定义格式(使用 MIME 类型 text/plain)来传递结构化数据。

性能可以分解为不同的组件;例如

  • 将内容编码为格式所用的相对时间,
  • 解码格式以提供原始内容所需的相对时间,以及
  • 编码内容的相对大小。

理论上,我们可以说一个假设的优化设计和实现的自定义格式不会比 JSON 慢或密度不低。 (“证明”很明显。选择 JSON 的最佳实现,并对不影响性能的格式进行一些小改动。)

但实际上,您必须比较实际格式和实际实现的性能。因此,性能实际上取决于您在设计和实现格式及其相关的编码/解码软件方面做得如何。此外,它还取决于您如何实现 JSON。有许多具有不同性能特征的服务器端 JSON 库,以及将数据从/映射到“ native ”数据结构的不同方式。

这让我们了解到 JSON(和 XML)相对于自定义格式的真正优势。

  • 借助 JSON 和 XML,您可以使用任何主流语言的库来协助编码和解码内容。使用自定义格式,您必须为客户端和服务器端滚动自己的编码/解码。

  • 对于 JSON 和 XML,有一些标准说明什么是格式良好的,允许其他人实现编码器/解码器。使用自定义格式,如果您希望其他人能够实现您的格式,则必须自己编写规范。

  • JSON 和 XML 具有处理字符集编码和出现在数据中的“元”字符等问题的标准方法。对于习惯,您必须自己了解和解决这些问题。 (如果你不这样做,你很可能会遇到困难。)

  • 易于更改。演化基于 JSON/XML 的格式是一件相对简单的事情。但是使用自定义格式,您(至少)还有更多工作要做,而且根据您的设计选择,这可能会非常困难。

对于大多数应用程序,这些问题远比性能更重要。这就是 JSON 或 XML 被广泛使用的原因。

跟进

But what if instead you assume that I'm not using a custom implementation and compare sending JSON with a mime type of text/plain to that of mime type application/json?

那么答案是它几乎没有 性能差异。

  • 您在 HTTP 请求或响应 header 中节省了 6 个字节,因为 mime 类型字符串更短,但这对于大小以数千字节为单位的典型 HTTP 消息来说是微不足道的。
  • 使用“text/plain”内容类型对编码/解码请求或响应消息所需的工作没有影响......除了比较/复制 6 个额外字节所花费的时间,即可能太小而无法测量。

此外,使用不准确的 MIME 类型(可以说)违反了 HTTP 规范。如果你这样做:

  • 接收方更有可能对响应处理不当;例如无法解码,或在浏览器窗口中显示,并且

  • 假设您的客户端或服务器使用它,您可能会中断 HTTP 内容类型协商。

简而言之,我想不出这样做的理由1,以及不这样做的一些理由。


1 - 一般情况下。显然,会有边缘情况......

关于javascript - 使用 application/json 优于 text/plain 的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350753/

相关文章:

python - 使用 simplejson 序列化简单类对象的最简单方法?

python - 使用 JSON 模块进行 pretty-print 时如何实现自定义缩进?

jquery - REST Web 服务与类似 RPC 的服务有何区别?

json - 如何将对象映射到数组以便可以将其转换为 csv?

ios - (Cocoa 错误 3840。)“(字符 0 周围的值无效。)AFNetworking

javascript - 短语对象文字表示法中的 "literal"是什么意思?

objective-c - 使用 Json 在 Objective C 中发布数据

ruby - 为什么我会得到 "no implicit conversion of String i

java - 如何在 Java 的 JSON 字符串中找到指定的名称及其值?

c# - 强制 JSON.NET 在序列化 DateTime 时包含毫秒(即使 ms 组件为零)