Search code examples
javascriptjavajsonnashorn

Java 8 Nashorm engine not able to fetch key from json object


I am trying to store a JSON object in nashorn engine and fetch value by key.

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.put("minimumBet", "{\"SEK\":\"1\",\"EUR\":\"2\"}");

//This prints {"SEK":"1","EUR":"2"}
System.out.println(engine.eval("minimumBet")); 

//This assert fails
//engine.eval("minimumBet['SEK']") is retruning null
assertEquals(1, engine.eval("minimumBet['SEK']"));

Please tell me what am I missing.


Solution

  • engine.put("minimumBet", "{\"SEK\":\"1\",\"EUR\":\"2\"}"); does not evaluate the value you place in the property, so you are just setting a string. You would need to eval the string inside the engine.

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    public class Test {
        public static void main(String[] args) {
            try {
                ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
                engine.put("minimumBet", "{\"SEK\":1,\"EUR\":2}");
                engine.eval("var bet = JSON.parse(minimumBet);");
                engine.eval("var krona = bet['SEK'];");
                engine.eval("var euro = bet['EUR'];");
                Object krona = engine.get("krona");
                Object euro = engine.get("euro");
                System.out.println(krona + " " + krona.getClass());
                System.out.println(euro + " " + euro.getClass());
            } catch (ScriptException ex) {
                ex.printStackTrace();
            }
        }
    }
    

    Yields:

    1 class java.lang.Integer
    2 class java.lang.Integer