如何从给定复杂 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 列表中检测冲突字符串?的主要内容,如果未能解决你的问题,请参考以下文章