首页 > 解决方案 > 有没有办法使用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

标签: javajsonconfig

解决方案


只是为了管理期望:在 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) * 31 + (2 * 3),所以没有树就不可能做到这一点,除非你深入研究奇怪的语法,其中词法排序匹配处理排序(如果你想要,看看逆波兰符号计算器是如何工作的,或者类似 fortran - 基于堆栈的语言设计。我认为你不会喜欢你在那里找到的东西)。

您已经在这里做出语言设计决策。显然,您认为该语言应该采用“真实”/“虚假”概念,其中dataMap.get("animal")可能返回一个动物对象,被认为是“真实”(因为您在布尔运算中使用它),如果大概,它不是空的或诸如此类的东西。

所以,你在这里设计了一门完整的编程语言。为什么要强制要求它是用 JSON 编写的,而 JSON 是极其不适合这项工作的呢?全力以赴,写一门完整的语言。当然,这需要2到3年。用 json 做这件事不会让这个总数减少一个多星期,而且会写出令人难以置信的令人讨厌的东西,没有人会这样做,什么都不会给你买。

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

JVM 是什么,价值 2000 人年的经验和努力?

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

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


推荐阅读