【问题标题】:Is there any way to write parsing logic using json?有没有办法使用json编写解析逻辑?
【发布时间】:2021-06-26 13:26:00
【问题描述】:

我在 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

我想创建一个配置文件,其中包含有关地图内数据应如何显示的所有规则。简单来说,就是想在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 文件基本上是一种存储元组的方式。你想要的看起来更像是一个 DSL,因为迟早你会想要评估的不是元组,而是表达式。我认为与其寻找 JSON 等数据格式,不如研究 DSL 和语法,也许是一个简单的编译器。我的 2c。
  • 任何代码示例或参考资料?
  • 意图不够明确,请给出完整的可运行示例。那么其他人可能会提出如何优化。
  • @exudong 添加示例

标签: java json config


【解决方案1】:

只是为了管理期望:在 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 节点,它是一个原子,值为 dataMap,以及一个包含 1 个元素的 args 列表节点,字符串文字原子 @987654333 @,准确地说。

一旦你看到这棵树,你就会明白优先级的概念是如何工作的 - 你的引擎需要能够同时表示 (1 + 2) * 31 + (2 * 3),所以在没有树的情况下这样做是不可能的,除非你深入研究奇怪的语法,其中词法排序匹配处理排序(如果需要,请查看反向波兰符号计算器的工作方式,或类似 fortran - 基于堆栈的语言设计。我认为您不会喜欢那里的内容)。

您已经在此处做出语言设计决策。显然,您认为该语言应该采用“真实”/“虚假”概念,其中dataMap.get("animal") 可能返回一个动物对象,如果,大概不是 null 之类的。

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

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

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

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

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

【讨论】:

  • 我只是想在配置文件中为map中的值定义所需的值和操作,这样就不需要使用if else条件来检查它们了
  • 问题是你敢用“公正”这个词。这就是这个答案的全部意义,显然它从你的头顶飞过。这不是“公正”的问题。你想要的东西非常复杂(或者如果你认为:不,它会很简单 - 任何简单的拍摄都非常不完整并且缺乏显着的灵活性)。
猜你喜欢
  • 2016-07-10
  • 2014-02-25
  • 1970-01-01
  • 2018-10-14
  • 2020-05-16
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多