2015-06-22 39 views
0

我對春天的表達語言很新。我有一個包含值作爲字符串的地圖。將字符串轉換爲雙重的春天表達語言

{ 
"id": "1", 
"object": { 
    "object1": { 
    "fields": { 
     "value1": { 
     "value":"3" 
     }, 
     "value2": { 
     "value":"2" 
     } 
    } 
    } 
} 
} 

彈簧表達,我有看起來像這樣,

((object['object1'].fields['value1'].value * object['object1'].fields['value2'].value) * 0.5) 

我的計算方法如下所示,其中SampleObject類有地圖對象

public Double calculation(String expression, SampleObject sampleObject){ 
    ExpressionParser parser = new SpelExpressionParser(); 
    Expression exp = parser.parseExpression(expression); 
    Double evaluatedValue = (Double)exp.getValue(sampleObject); 
    return evaluatedValue; 
} 

由於值是字符串,我得到一個錯誤,說不能將字符串轉換爲Double。這可如果我改變這樣

((new Double(object['object1'].fields['value1'].value) * new Double(object['object1'].fields['value2'].value)) * 0.5) 

表達被淘汰,但我正在尋找一個解決方案,我沒有改變表達式或對象。有沒有解決方案。

在此先感謝

回答

0

由於您的JSON有value1.valuevalue2.value作爲字符串表達式拋出異常。

要麼改變你的JSON有十進制值

{ 
"id": "1", 
"object": { 
    "object1": { 
    "fields": { 
     "value1": { 
     "value":3.0 
     }, 
     "value2": { 
     "value":2.0 
     } 
    } 
    } 
} 
} 

還是在表達方法,而不是鑄造做解析。

public Double calculation(String expression, SampleObject sampleObject){ 
    ExpressionParser parser = new SpelExpressionParser(); 
    Expression exp = parser.parseExpression(expression); 
    Double evaluatedValue = Double.parseDouble(exp.getValue(sampleObject).toString()); // This line 
    return evaluatedValue; 
} 
+0

正如我提到的問題,我做不想改變地圖。此外,您的第二個建議不起作用,因爲問題出現在表達式中,而不是評估值中。所以我仍然得到這個錯誤消息「運算符'MULTIPLY'不支持'java.lang.String'和'java.lang.String'類型的對象之間」也是FYI,第二個解決方案也可以像這樣實現,Double evaluateValue = exp.getValue(sampleObject,Double.class); – Visahan

1

您可以插件支持這些操作類型的操作類:

class StringDoubleOperatorOverloader implements OperatorOverloader { 

    @Override 
    public boolean overridesOperation(Operation operation, Object leftOperand, 
      Object rightOperand) throws EvaluationException { 
     return operation==Operation.MULTIPLY && 
       leftOperand instanceof String && 
       rightOperand instanceof String; 
    } 

    @Override 
    public Object operate(Operation operation, Object leftOperand, Object rightOperand) 
      throws EvaluationException { 
     Double l = Double.valueOf((String)leftOperand); 
     Double r = Double.valueOf((String)rightOperand); 
     return l*r; 
    } 

} 

然後通過一個定製的StandardEvaluationContextgetValue()

ExpressionParser parser = new SpelExpressionParser(); 
    Expression exp = parser.parseExpression(expression); 

    StandardEvaluationContext sec = new StandardEvaluationContext(); 
    sec.setOperatorOverloader(new StringDoubleOperatorOverloader()); 

    Double evaluatedValue = (Double)exp.getValue(sec,new SampleObject()); 
+0

當表達式包含更多值和更多算術運算時,這將不起作用,表達式將更改,但格式不能更改。這是我的問題。另外我傳遞的樣本對象像exp.getValue(sampleObject),因爲該對象是包含值的那個。 – Visahan

+0

如果你擴展你的插件運算符overloader支持的類型和操作,它肯定會工作嗎?你可以使覆蓋操作和操作方法做你喜歡的任何事情。我的目標是找到一個解決方案,您不必更改表達式或包含數據的對象。你所做的主要變化是我使用了getValue()的兩個arg版本,除了包含數據的對象之外,還允許我傳入不同的評估上下文。我的'新SampleObject()'就是我如何構建一個代表你在做什麼的測試用例,你可以傳入sampleObject。 –