【问题标题】:Parse JSON object using RegEx使用 RegEx 解析 JSON 对象
【发布时间】:2014-07-25 06:24:19
【问题描述】:

我有以下 JSON 字符串:

{"FirstName":"John","LastName":"Smith"}

当我应用以下正则表达式时,它会正确返回键值对组:

(?<keyValuePair>(?<key>"\w+"):(?<value>".*?[^\\]"+?))+?

我得到了比赛:

1. "FirstName":"John"
    1.1 key:"FirstName"
    1.2 value:"John"
2. "LastName":"Smith"
    2.1 key:"LastName"
    2.2 value:"Smith"

现在,我想要一个对象组,即查找所有对象。在同一个 JSON 字符串上,我应用以下正则表达式

(?<object>{(?<properties>.*?)})

我得到了比赛:

1. {"FirstName":"John","LastName":"Smith"}
    1.1 object : {"FirstName":"John","LastName":"Smith"}
    1.2 properties : "FirstName":"John","LastName":"Smith"

我想要的是获取第一个正则表达式的组作为第二个正则表达式中的属性子组。

所以预期的结果应该是:

1. {"FirstName":"John","LastName":"Smith"}
    1.1 object : {"FirstName":"John","LastName":"Smith"}
    1.2 properties : "FirstName":"John","LastName":"Smith"
        1.2.1 "FirstName":"John"
            1.2.1.1 key : "FirstName"
            1.2.1.2 value : "John"
        1.2.2 "LastName":"Smith"
            1.2.2.1 key : "LastName"
            1.2.2.2 value : "Smith"

有人可以帮我创建一个正则表达式来获得上述结果。

这不会被视为重复

自过去 3 小时以来,我已经尝试了很多事情,我的思绪在旋转。

【问题讨论】:

  • 您是否有理由使用 RegEx 而不是例如JSON.net?
  • 我认为通过正则表达式解析 JSON 不是一个好主意。为什么不直接使用Newtonsoft JSON 及其JObject
  • 我有一个从数据库中获取数据并在 .Net 中处理的应用程序。查询是由用户在运行时提供的,所以我不知道架构。他们创建了一个自定义解析器,处理该 json 大约需要 4.5 秒。 Newtonsoft 花了 6 秒。我想尽可能缩短时间。我想看看我是否可以使用正则表达式来实现它。
  • 我假设您的意思是 6 秒来解析大量 JSON。上面的示例很小。
  • json 很大。返回数据的网络服务有一个对象,我正在执行的查询有 197 个字符串属性,总共有 6000 个对象

标签: c# regex json


【解决方案1】:

自过去 3 小时以来,我已经尝试了很多事情,我的想法是 纺纱。

不要开玩笑,一点也不,但是在 3 小时内,您可以为 JSON 编写递归下降解析器,或者在大约 30 分钟内,您可以安装 JSON.NET,阅读文档/示例并继续其他事物。为什么不现在试试呢?用正则表达式解析 JSON 没有前途,因为 JSON 是一种上下文无关的语言,它是递归的并且可能无限长并且嵌套。正则表达式是 DFA/NFA。它无法处理 CFG。有点像Parsing HTML with Regex(好吧,我无法抗拒)

除非您的 JSON 类型非常有限并且绝对反对添加 3rd 方库,否则我不会打扰。把它归结为学习经验。

【讨论】:

  • 我已经尝试过 Newtonsoft,我们确实有一个自定义 JSON 解析器,它的性能比 Newtonsoft 更好,但是正如我所提到的,两者分别消耗 6 秒和 4 秒,因此我正在寻找更快的选项并转向正则表达式
  • 嗯..问题是:正则表达式会比编写良好的自定义解析器更快吗?我有个疑问。 JSON 看起来很简单,但递归可能是致命的。
  • 您的潜在 json 输入是否非常有限?如 - 你能在一页中合理地描述可能的输入吗?即便如此,我仍然会考虑手写递归下降解析器。可能是慢的部分是查找/映射到对象属性,而不是实际的解析。
  • JSON 将简单地返回具有简单字符串属性且没有嵌套的对象数组。
  • 嗯..你写的是“所以我不知道架构”。看起来您知道架构,所以我认为自定义的、编写良好的解析器将比正则表达式更有效。 (我认为在一个阶段中逐个字符地解析 JSON 就足够了)。正则表达式不会做得更快。
猜你喜欢
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多