有没有任何方法可以使用json编写解析逻辑



我在java map<字符串,对象>内容如下的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

我想创建一个配置文件,其中包含关于Map中数据外观的所有规则。简单地说,我想在配置文件中定义与关键字country、animal和age对应的值应该遵循的条件,以及应该对它们执行什么操作,这样就可以删除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;
}

现在假设我想在配置文件中为每个映射值定义条件,比如操作(equals,OR,contains(和测试值,而不是使用if-elses。然后配置文件可以用于解析java映射

只是为了管理期望:在JSON中这样做是一个可怕的想法。

给你一些你想要做的东西的想法:

像这样的语法最好用树形结构来表示。此树中的"节点"是:

  • "原子"(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]存储为INVOKEVIRTUALjava.util.Map :: get(Object),作为"接收器"的是一个IDENT节点,它是一个原子,值为dataMap,以及一个包含1个元素的args列表节点,确切地说,它是字符串文字原子"animal"

一旦你看到了这个树,你就会看到优先级的概念是如何工作的——你的引擎需要能够同时表示(1 + 2) * 31 + (2 * 3),所以除非你深入研究奇怪的语法,否则在没有树的情况下这样做是不可能的,词汇排序匹配处理排序(如果你想要的话,看看反向抛光记法计算器是如何工作的,或者类似于基于fortran堆栈的语言设计。我认为你不会喜欢那里的结果(。

您已经在这里做语言设计决策了。显然,你认为语言应该采用一个"truthy"/"falsy"的概念,其中dataMap.get("animal")可能返回一个动物对象,如果它不是null或其他什么,则被认为是"true"(就像你在布尔运算中使用它一样(。

所以,你在这里设计一个完整的编程语言。为什么要强制要求它是用JSON编写的呢?JSON根本不适合这份工作?全力以赴,写出一门完整的语言。当然,这需要2到3年的时间。用json做这件事不会减少超过一周的时间,也不会让一些写起来非常烦人的东西,没有人会做,什么都不买。

语言也会自然而然地趋向于图灵的完整性。一旦一门语言变得完整,在数学上就不可能回答这样的问题:;这段代码真的会完成运行吗?还是会永远循环"(请参阅"停止问题"(,您不知道它需要多少内存或CPU功率,以及其他导致安全需求的问题。这些都是可以解决的问题(例如沙箱(,但都非常复杂。

JVM是2000人年的经验和努力吗?

如果你有2000年的时间来写这一切,无论如何。重点是:这里没有"简单"的方法。这是一件令人遗憾的不完整的事情,你永远不会觉得你真的可以做你想做的事情(即以一种足够自然的方式表达任意的想法,可以被你的系统解析,当你读回时仍然有意义(,或者它和任何语言一样复杂。

为什么不。。。使用一种语言?让人们不写JSON,而是写完整的java、js、python、ruby、lua,或者任何其他已经存在的东西,是开源的,看起来设计得很好吗?

相关内容

最新更新