当服务器返回的对象的属性顺序很重要时,我应该使用JSON还是XML?

时间:2019-01-14 03:36:13

标签: mysql json xml reactjs

客户端使用ReactJS,服务器使用Node,Express和MySQL作为数据库。我正在建立一个允许用户发布新闻文章的网站,例如较长的正文,其中的图像随机插入其中。想想像Medium这样的网站,该网站允许用户随时撰写博客文章并插入图片。

我的问题在于我如何存储每篇文章的信息。最初,我将使用XML-使用和标记,并将每篇文章表示为XML文档。这样,当服务器从数据库中提取XML文档后解析XML文档时,将保留元素的顺序。

例如:

<<text> /* long body of text (e.g. about 300 - 500 words?) */ </text>
<img> First image path goes here </img>
<text> /* Another body of text! */ </text>
<img> Some cool graph that's relevant for the article </img>

当我的服务器尝试解析此XML文档时,顺序非常重要。必须首先解析第一个文本标签(上面的代码示例中的第1行)的内容。然后,在该图像下方应该是第一张图像(第2行)。完整的XML文档解析后,应将其发送到客户端,React将在客户端遍历返回的对象,并为每个对象创建一个段落或图像ReactElement。

对于大多数事情,我都使用JSON来表示客户端和服务器交换的对象。但是,我很清楚,在JSON对象中,键{key:value}的顺序没有保留。因此,有可能(请参阅上面的愚蠢代码段)将第2行添加到我的VirtualDOM中,然后添加到第1行之前,从而使输出顺序不正确。

因此,我应该将JSON或XML用作1)服务器返回的对象的格式以及2)每篇文章的表示形式。

2 个答案:

答案 0 :(得分:1)

XML和JSON都能够以保留顺序的方式表示数据。与您的XML等效的最接近的JSON可能是:

[
  {"text":"long body of text (e.g. about 300 - 500 words?)"},
  {"img":"First image path goes here"},
  {"text":"Another body of text!"},
  {"img":"Some cool graph that's relevant for the article"}
]

由于顺序很重要,因此您必须在此处使用数组。

您可能会说这种结构看起来很奇怪,这是正确的。 JSON从未设计用于表示文档结构。我强烈质疑使用JSON以您提出的方式表示自由格式文章的智慧。 JSON在某些方面比XML更好,而XML在某些方面比JSON更好,并且您的应用程序绝对处于第二类。

答案 1 :(得分:0)

MySQL的JSON数据类型不保留顺序,但是您可以将其存储为字符串,这样可以节省幂等性。但是您将失去使用MySQL JSON函数的能力,如果处理主要在应用程序中,您可能可以使用它。