killme2008 / killme2008/aviatorscript
多级字段取值自动判空能力
- Lingua principale
- Java
- Stelle
- 5.2k
- Fork
- 906
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
### 背景
在表达式使用的过程中,我们经常会通过表达式从上下文中进行取值。例如:
```java
JSONObject context = new JSONObject();
JSONObject result = new JSONObject();
Map featureMap = Maps.newHashMap();
featureMap.put("f1", "1L");
result.put("featureMap", featureMap);
context.put("result", result);
```
有一个context作为上下文,需要取其featureMap的f1字段值,我们的表达式会写成
```shell
## $=context
$.result.featureMap.f1
```
### 存在的问题
但是,这种写法需要使用方自己保证 $、result、featureMap都必须为非空的字段,否则aviator会在执行过程中抛出异常;而在使用过程中我们通常是无法确保的,所以需要进行判空操作。此时,表达式就需要写成如下形式:
```shell
if($!=nil) {
if($.result!=nil) {
if($.result.featureMap!=nil) {
return $.result.featureMap.f1;
}
}
}
```
### 需求期望
这样的写法虽然能够保障表达式的正常执行,但是在多级字段的取值使用中对用户是不太友好的,我们希望能够可以通过类似mvel的方法直接进行判空,如下:
```shell
$.?result.?featureMap.?f1
```
通过.?的语法对其左值进行判空,当其左值为空时直接返回空
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Direzione di ricerca
La issue non indica file o test. Inizia individuando i punti di ingresso del parser e del valutatore delle espressioni per l'accesso ai campi annidati, quindi traccia il modo in cui i valori null attualmente producono eccezioni. Il lavoro è completo quando la sintassi proposta `.?` è supportata a ogni livello e restituisce null quando il suo valore a sinistra è null, con copertura per gli esempi annidati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- java
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 25/100