1

希望从 json 中提取标量值。

  • 知道 JSON 使用双引号。

  • 知道标量的数据类型:字符串、数字、日期、布尔值。

  • 知道标量将在第一级,即不是嵌入对象的属性

    {“想要”:“字符串”} =>“字符串”

    {“想要”:123 } => 123

    {“不”:{“想要”:“错误”},“想要”:“正确”} =>“正确

    { "nothing": 0 } => null / 未找到

不知道如何处理开/关引号,也不知道如何处理嵌入对象。

这可能吗?


这是迄今为止我想出的最好的:

// match `want` attribute
(?:"want"\s*:\s*)                                        

// string, number, boolean or null
(((?:")([^"]*)(?:"))|([-0-9][.eE0-9]*)|true|false|null)

// followed by comma or right bracket
(?:\s*(,|}))

这很好,因为它

  • 可以运行postgres

  • 抓弦

  • 抢号码

  • 抓取布尔值和空值

这很糟糕,因为它

  • 不确保want是一级属性

  • 字符串值不能包含引号 (")

4

1 回答 1

1

这个表达式会让你到达那里的 50%:

(?<=:\s*)(".*?"(?<!\\")|\-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?)(?=\s*})

或者,当编写为多行正则表达式时:

(?x:
    (?<=:\s*)           # After : + space
    (

        ".*?"(?<!\\")   # String in double quotes

        |               # -or-

        \-?             # Optional leading -ve
        (0|[1-9]\d*)    # Number
        (\.\d+)?        # Optional fraction
        ([eE][+-]?\d+)? # Optional exponent

    )
    (?=\s*})            # space + }
)

这与您的嵌套对象示例 ( { "not": { "want" ...) 不匹配,或者更确切地说,它将匹配,但在错误的事情上。此外,您的最后一个示例 ( { "nothing": 0 } => null / not found) 很困难,因为0它是一个有效数字。要解决此问题,我只需检查程序代码中的结果并将结果替换0null.

嵌套对象问题是一个完全不同的球类游戏。它正在进入词法分析领域,而不是简单的标记化。那时,您不妨只使用 JSON 库,因为无论如何您都将编写完整的 JSON 解析器。幸运的是,JSON 是一种足够简单的语法,使用第三方库不会那么昂贵——当然不会比你自己做更多。

我认为简短的回答是:从一个简单的{ "name" : <value> }对象,是的,但从任何更复杂的,不。

有关 JSON 语法的信息,请参阅http://www.json.org/

于 2012-06-15T10:43:35.917 回答