如何从给定复杂 JSON 的 JSON 列表中检测冲突字符串?

Posted

技术标签:

【中文标题】如何从给定复杂 JSON 的 JSON 列表中检测冲突字符串?【英文标题】:How to detect conflicting strings from a list of JSON given a Complex JSON? 【发布时间】:2020-11-27 00:14:03 【问题描述】:

给定多个条件的组合,其中包含运算符,例如

section = "ABC" AND type = "A" AND status = "RESPONDED" AND scores NOT_NULL AND scores.productA NOT_NULL AND scores.productA > 10 AND scores.productA < 30

这会导致多个操作,例如

priority = 3 AND hours = 24 AND isQualified = true

目标是找到与该字符串冲突的 JSON 字符串。冲突将是什么时候 相同的条件(相同或不同的顺序)导致不同的动作或导致具有不同值的动作 有一个 mysql 表,将这些 json 字符串存储在一个列中,需要针对该列进行查询

已经尝试过像 JSON_CONTAINS 这样的 MySQL JSON 函数,但是如果嵌套的 json 对象的顺序不同,它就不起作用。 还尝试使用 LIKE 对单个条件进行字符串比较,这些条件有效,但要发生匹配,我们 需要考虑条件的分组和加入它们的运算符。

任何建议都会很棒。理想情况下,能够在 SQL 级别执行此操作会很棒,但结合使用 SQL 来缩小范围,然后对缩小的值进行第二次传递也可能有效。

表示条件动作的JSON字符串可以像

那样指定

    "actions": [
        "actionItem": 
            "SetValueAction": 
                "value": 
                    "long": 24
                ,
                "dataField": 
                    "field": "hours",
                    "object": 
                        "className": "Message",
                        "objectName": "message"
                    
                
            
        
    , 
        "actionItem": 
            "SetValueAction": 
                "value": 
                    "boolean": true
                ,
                "dataField": 
                    "field": "isQualified",
                    "object": 
                        "className": "Message",
                        "objectName": "message"
                    
                
            
        
    , 
        "actionItem": 
            "SetValueAction": 
                "value": 
                    "long": 3
                ,
                "dataField": 
                    "field": "priority",
                    "object": 
                        "className": "Message",
                        "objectName": "message"
                    
                
            
        
    ],
    "condition": 
        "ConditionGroup": 
            "logicalOperator": "AND",
            "conditionGroupItems": [
                "Condition": 
                    "conditionItem": 
                        "FieldConstraint": 
                            "value": 
                                "string": "ABC"
                            ,
                            "operator": "EQ",
                            "dataField": 
                                "field": "section",
                                "object": 
                                    "className": "Message",
                                    "objectName": "message"
                                
                            
                        
                    
                
            , 
                "Condition": 
                    "conditionItem": 
                        "FieldConstraint": 
                            "value": 
                                "string": "A"
                            ,
                            "operator": "EQ",
                            "dataField": 
                                "field": "type",
                                "object": 
                                    "className": "Message",
                                    "objectName": "message"
                                
                            
                        
                    
                
            , 
                "Condition": 
                    "conditionItem": 
                        "FieldConstraint": 
                            "value": 
                                "string": "RESPONDED"
                            ,
                            "operator": "EQ",
                            "dataField": 
                                "field": "status",
                                "object": 
                                    "className": "Message",
                                    "objectName": "message"
                                
                            
                        
                    
                
            , 
                "Condition": 
                    "conditionItem": 
                        "FieldConstraint": 
                            "operator": "NOT_NULL",
                            "dataField": 
                                "field": "scores",
                                "object": 
                                    "className": "Message",
                                    "objectName": "message"
                                
                            
                        
                    
                
            , 
                "Condition": 
                    "conditionItem": 
                        "FieldConstraint": 
                            "operator": "NOT_NULL",
                            "dataField": 
                                "field": "scores.productA",
                                "object": 
                                    "className": "Message",
                                    "objectName": "message"
                                
                            
                        
                    
                
            , 
                "Condition": 
                    "conditionItem": 
                        "FieldConstraint": 
                            "value": 
                                "double": 10
                            ,
                            "operator": "GT",
                            "dataField": 
                                "field": "scores.productA",
                                "object": 
                                    "className": "Message",
                                    "objectName": "message"
                                
                            
                        
                    
                
            , 
                "Condition": 
                    "conditionItem": 
                        "FieldConstraint": 
                            "value": 
                                "double": 30
                            ,
                            "operator": "LE",
                            "dataField": 
                                "field": "scores.productA",
                                "object": 
                                    "className": "Message",
                                    "objectName": "message"
                                
                            
                        
                    
                
            ]
        
    
  

【问题讨论】:

【参考方案1】:

在 SQL 中没有复杂的框架可以满足您的要求。 使用 Java - 这很简单。

但是 - 你可以使用以下输入在 mysql 中构建逻辑

1.) 使用 JSON_SEARCH 和文本条件 1.) "condition" 2.) "actionnItem" 并给出 'all' 搜索以返回所有匹配的字符串路径 https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-search

2.) 您将有两个用于条件和操作项的输出集

3.) 现在每个循环都有两个单独的 while 循环,并从步骤 1/2 中确定的路径解析,并根据您的 JSON 格式再次对 operator 、 datafield 和其他文本执行 json_search。

详细的 JSON 函数可在此处获得 - https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

【讨论】:

Srikanth,感谢您的回复。您能否详细说明一下 JAVA 的方式是如何简单的?列表中的所有 JSON 都将具有条件和 actionItem,如果我正确理解您的观点,两个单独的循环将覆盖所有 JSON。我查看了 JSON_SEARCH 和其他函数,但只有 say 运算符的值,datafield.field 可能不起作用,该值的路径(嵌套级别)也需要匹配以缩小搜索空间。 澄清一下,是 SQL 中的步骤 1-3 还是它与 Java 的组合?您能否详细说明使用 JSON_SEARCH 的第 3 步? 嗨,它是通过 sql 函数,你可以构建这个逻辑 - 因为你喜欢 SQL - 我已经添加了 SQL 步骤

以上是关于如何从给定复杂 JSON 的 JSON 列表中检测冲突字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 数据流:从 JSON 字符串解析对象的嵌套列表

如何使用 jq 从复杂的 JSON 文件中获取简单的 JSON 数据文件

如何从复杂的 JSON 对象中获取值?

JSON 从最后一个对象中删除尾随逗号

如何从 JSON 中的月份列表中选择当前月份?

scala spray-json 如何解析一个复杂的 数组JSON