【问题标题】:Should I parse json string to json object or manipulate the string directly我应该将 json 字符串解析为 json 对象还是直接操作字符串
【发布时间】:2019-06-11 19:35:42
【问题描述】:

通常我将 json 字符串解析为 json 对象,而不是直接操作 json 字符串。例如,像

这样的json字符串
{"number": "1234567"}

如果我必须在末尾添加 000

...
{...,"number" : "1234567000",...}
....

我将使用 jackson 将其解析为 Json 对象或 POJO

我了解将可读性透视图解析为 Json 对象或 POJO 要好得多,但我对性能感到好奇。在这种情况下,如果我直接操作json字符串,我必须使用正则表达式提取数字属性,并在末尾添加000,这比如果有大量数据解析成Json Object要贵得多?因为字符串对象基本上是创建一个新的字符串对象?

编辑: 基于@Itai Steinherz 的链接,我还在 JS 中做了一个基准测试,它表明 json 解析更好 https://jsbench.me/93jr1w6k5b/1

【问题讨论】:

  • 您为什么不自己在负载下或使用 currentMillis 检查性能并告诉我们?这实际上取决于各种因素,例如 json 大小等
  • 每次你必须在解析和正则表达式之间做出决定时,去解析。解析器有严格的规则,由专业团队维护(几乎总是)。而编写自己的正则表达式很容易出错
  • Everytime you have to decide between parse and regex, go for parse 这不是真的,如果性能真的是一个瓶颈,你可以考虑做一些疯狂的事情。正如我所说,如果真的如此。
  • @deathangel908 是的,使用高度专业化的代码,您可能会挤出一些性能,但您无法控制的 Json 上的字符串操作肯定会以令人讨厌的方式出现问题。如果您可以控制 Json(结构、内容等),那么通过更改 Json/api 本身可能会有更快、更简单且不易出错的方法来实现它。
  • 如果您不能完全控制可能的输入,当“只是将几个零附加到一个数字”时,正则表达式可能会中断:预期为数字的字符串包含非数字(例如 .E) - 你在做什么?默默地保持输入不变?扔?无论如何都附加零?如果“数字”是 0 怎么办 - 追加几个零是正确的做法,还是您的意思是添加 +1000

标签: java json string jackson


【解决方案1】:

由于我对 Java 中的 JSON 解析/操作不是很熟悉,所以我将比较 JavaScript 中的相同操作(我比较有经验)。

比较使用基本正则表达式与.replace 并使用JSON.parseJSON.stringify,结果是使用JSON.parse 会慢一小部分(准确地说是4.37%) .

但是,我认为性能提升并不值得,我总是会使用更具可读性和可维护性的代码(JSON.parse 方法),而不是性能更高的代码(.replace 方法)。

查看我使用的完整基准 here

【讨论】:

  • 这个问题是关于 java 而不是 javascript,尽管您在第二段中有一个可能的有效答案
  • 谢谢,我什至没有注意到。我会更新我的答案。
  • 我根据您的链接添加了更多操作,它表明 JSON.parse 表现更好jsbench.me/93jr1w6k5b/1
  • @AkiraSendoh 那是因为您正在比较两段执行不同操作的代码。第一组number1...number13{jsonObject.number}000,第二组number{number}000 13 次。
  • 我改为.number而不是number1 ... number13,结果是一样的。如果创建了几个新属性并且它应该进一步减慢 Json Parse 方法,或者?
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多