验证来自 Mongo 的 JSON?

Posted

技术标签:

【中文标题】验证来自 Mongo 的 JSON?【英文标题】:Validate JSON from Mongo? 【发布时间】:2016-09-10 20:20:46 【问题描述】:

我想检查用户输入的文本是否是有效的 JSON。我知道我可以使用这样的方法轻松做到这一点:

function IsJsonString(str) 
    try 
        JSON.parse(str);
     catch (e) 
        return false;
    
    return true;

我的问题是来自 Mongo 的 JSON,它包含在 ObjectIdISODate 中,即:


    "_id" : ObjectId("5733b42c66beadec3cbcb9a4"),
    "date" : ISODate("2016-05-11T22:37:32.341Z"),
    "name" : "KJ"

这不是有效的 JSON。在允许上述内容的同时如何验证 JSON?

【问题讨论】:

【参考方案1】:

你可以用字符串替换裸函数调用,像这样

function IsJsonLikeString(str) 
  str = str.replace(/(\w+)\("([^"]+)"\)/g, '"$1(\"$2\")"');
  try 
    JSON.parse(str);
   ...

来自https://regex101.com/r/fW7iH4/#javascript的解释:

/(\w+)\("([^"]+)"\)/g
    1st Capturing group (\w+)
        \w+ match any word character [a-zA-Z0-9_]
            Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]
    \( matches the character ( literally
    " matches the characters " literally
    2nd Capturing group ([^"]+)
        [^"]+ match a single character not present in the list below
            Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]
            " a single character in the list " literally (case sensitive)
    " matches the characters " literally
    \) matches the character ) literally
    g modifier: global. All matches (don't return on first match)

【讨论】:

这绝对可以解决问题!我所做的唯一调整是而不是 '"$1(\"$2\")"',我在 $2 '"$1(\'$2\')"' 周围加上了单引号,因此它显示为 "ObjectId('1234')" 而不是 "ObjectId("1234")",其中引号会自行转义。【参考方案2】:

您遇到的问题不是 JSON 验证,而是与数据库是否实际接受输入数据有关。您有正确的想法来检查语法是否正确,但是您必须通过 mongo 集合运行数据并检查是否有任何错误。

查看 MongoDB db.collection.explain() 以验证它是否是有效的 Mongo 查询

【讨论】:

以上是关于验证来自 Mongo 的 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

在 mongo、node、passport 和 heroku 上对用户进行身份验证。几天后停止工作

如何验证来自 json 响应(Python)的数据?

无法使用 c# 根据来自 json 的 json 元素属性值验证数据条件

RestAssured 中的无效 JSON Schema 异常,同时针对来自 swagger 的模式进行验证

mongo的身份验证和授权

Mongo使用护照身份验证创建用户错误