java - 有没有办法使用json编写解析逻辑?
问题描述
我在 java Map<String,Object> dataMap 中有一张地图,其内容如下所示 -
{country=Australia, animal=Elephant, age=18}
现在,在解析地图时,可以使用各种条件语句,例如 -
if(dataMap.get("country").contains("stra")
OR
if(dataMap.get("animal") || 100 ==0)
OR
Some other operation inside if
我想创建一个配置文件,其中包含有关地图内数据应如何显示的所有规则。简单来说,就是想在config文件中定义key country、animal、age对应的value应该遵循的条件,对它们进行什么操作,这样就可以去掉if else和额外的代码。配置文件将用于解析地图。
谁能告诉我如何编写这样的配置文件,以及如何在 Java 中使用它?示例示例和代码参考将有所帮助。
我正在考虑为此目的创建一个 json 文件
例子 -
Boolean b = true;
List<String> conditions = new ArrayList<>();
if(dataMap.get("animal").toString().contains("pha")){
conditions.add("condition1 satisifed");
if(((Integer.parseInt(dataMap.get("age").toString()) || 100) ==0)){
conditions.add("condition2 satisifed");
if(dataMap.get("country").equals("Australia")){
conditions.add("condition3 satisifed");
}
else{
b=false;
}
}
else{
b=false;
}
}
else{
b=false;
}
现在假设我想在配置文件中为每个映射值定义条件,例如操作(等于、或、包含)和测试值,而不是使用 if else 的。然后配置文件可以用来解析java map
解决方案
只是为了管理期望:在 JSON 中这样做是一个可怕的想法。
为了让您了解您正在尝试制作的内容:
像这样的语法最好可视化为树结构。这棵树中的“节点”是:
- 'atomics'(
100
是一个原子,所以是"animal"
,所以是dataMap
)。 - “操作”(
+
是操作,or
/也是||
)。 - 可能是“动作”,尽管您可以将它们编码为操作。
Java 是这样工作的,几乎所有的编程语言也是如此,一个相对简单的“数学表达式引擎”也是如此,例如可以将字符串计算"(1 + 2) * 3 + 5 * 10"
为59
.
在java中,dataMap.get("animal") || 100 ==0
被解析成这棵树:
OR operation
/ \
INVOKE get[1] equality
/ \ / \
dataMap "animal" INT(100) INT(0)
其中 [1] 存储为 INVOKEVIRTUAL java.util.Map :: get(Object)
,其中作为“接收者”的 IDENT 节点是一个原子,具有 value dataMap
,以及一个包含 1 个元素的 args 列表节点,即字符串文字 atomic "animal"
,非常准确。
一旦你看到这棵树,你就会明白优先级的概念是如何工作的——你的引擎需要能够同时表示(1 + 2) * 3
和1 + (2 * 3)
,所以没有树就不可能做到这一点,除非你深入研究奇怪的语法,其中词法排序匹配处理排序(如果你想要,看看逆波兰符号计算器是如何工作的,或者类似 fortran - 基于堆栈的语言设计。我认为你不会喜欢你在那里找到的东西)。
您已经在这里做出语言设计决策。显然,您认为该语言应该采用“真实”/“虚假”概念,其中dataMap.get("animal")
可能返回一个动物对象,被认为是“真实”(因为您在布尔运算中使用它),如果大概,它不是空的或诸如此类的东西。
所以,你在这里设计了一门完整的编程语言。为什么要强制要求它是用 JSON 编写的,而 JSON 是极其不适合这项工作的呢?全力以赴,写一门完整的语言。当然,这需要2到3年。用 json 做这件事不会让这个总数减少一个多星期,而且会写出令人难以置信的令人讨厌的东西,没有人会这样做,什么都不会给你买。
该语言也将自然趋向于图灵完备。一旦一种语言完成了,在数学上就不可能回答这样的问题:“这段代码真的会完成运行还是会永远循环?” (请参阅“停止问题”),您不知道它需要多少内存或 CPU 功率,以及其他导致安全需求的问题。这些都是可以解决的问题(例如沙盒),但都非常复杂。
JVM 是什么,价值 2000 人年的经验和努力?
如果你有 2000 年的时间来写这一切,无论如何。关键是:这里没有“简单”的方法。这是一件非常不完整的事情,永远不会觉得你真的可以做你想做的事(这是以一种感觉足够自然的方式表达任意想法,可以由你的系统解析,当你回读时仍然有意义) ,或者它和任何语言一样复杂。
为什么不只是......使用一种语言?让人们不要写 JSON,而是写完整的 java、js、python、ruby、lua,或者其他任何已经存在的东西,是开源的,看起来设计得很好?