ASN.1与JSON:何时适合使用它们?

16
ASN.1 和 JSON 哪种更好用?它们各自的优缺点是什么?
3个回答

28

ASN.1和JSON并不是严格可比的。JSON是一种数据格式,而ASN.1是一个模式语言加上多个编码规则集,每个规则集对于给定模式会产生不同的数据格式。因此,原始问题有点类似于“XML Schema与XML:何时使用它们?”更公平的比较应该是ASN.1和JSON Schema。

尽管如此,还有一些需要考虑的要点:

  • ASN.1具有二进制编码规则。考虑到对于您的应用程序来说,二进制还是文本编码更合适。
  • ASN.1也有XML和JSON编码规则。如果您喜欢,可以选择使用基于文本的ASN.1进行编码。
  • ASN.1允许开发其他编码规则。在ITU-T为JSON指定编码规则之前,我们指定了自己的规则将ASN.1编码为JSON。我在我们公司网站上发表了这篇文章 这里
  • 与XML Schema一样,存在用于编译ASN.1的工具。这些通常被称为数据绑定工具。编译器输出由用于保存数据的数据结构和用于对各种编码(二进制、XML、JSON)进行编码/解码的代码组成。
  • 我不确定是否存在任何用于JSON Schema的数据绑定工具。我也不确定JSON Schema有多成熟/稳定,而ASN.1则非常成熟和稳定。
  • 在选择JSON Schema和ASN.1之间,请注意JSON Schema绑定到JSON,而ASN.1没有绑定到任何特定的表示。

我在 JSON 工具/库中看到的一件事是,在某些语言中它们放弃了。我了解到您可以在 JSON 模式中表示联合,但我听说 C# 工具放弃了这一点,因为 C# 没有联合。而我在 C# 中使用的所有 ASN.1 工具都有很好的类(包括 CHOICE)。我认为 GPB(其中包含 oneof)在 C# 中也做得不错。 - bazza

4
您可以使用ASN.1,无论您需要将消息序列化以供使用C、C++、C#、Java或任何其他编程语言的ASN.1编码器/解码器引擎发送到接收者。 ASN.1还提供了多种编码规则,具有不同情况下的优点。例如,在数字证书等关键情况下,需要规范编码时使用DER,而在带宽关键协议(例如移动通信)中使用PER,当您不关心带宽并希望在浏览器中显示编码或与XML模式引擎交换消息时,则使用E-XER。
请注意,使用良好的ASN.1工具,您无需更改应用程序代码即可在这些ASN.1编码规则之间切换。一个简单的函数调用就可以选择您想要使用的编码规则。

2
Java和JSON有什么关系? - Eric des Courtis
我的理解是,您所说的JSON指的是JavaScript对象表示法。即使Java是其名称的一部分,您是否告诉我这与Java无关? - Paul Thorpe
2
好的。我对JSON文本格式了解不多,但我对ASN.1非常熟悉,它具有灵活性,可以根据您的需求生成非常紧凑的二进制编码(PER)或冗长的XML编码。 - Paul Thorpe
我编辑了答案,删除了关于不与Java绑定的部分。 - Paul Thorpe

1

这里可以找到一篇关于JSON、XML、ASN.1、EXI和ProtoBuf的优秀研究论文。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接