// Copyright (c) 2015, SAS Institute Inc., Cary, NC, USA, All Rights Reserved package com.sas.unravl.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.spi.json.JsonProvider; import com.sas.unravl.UnRAVLException; import com.sas.unravl.UnRAVLRuntime; import com.sas.unravl.util.Json; import java.util.List; import java.util.Map; import org.junit.Test; public class TestJsonPath { @Test public void testJsonPath() throws UnRAVLException { UnRAVLRuntime r = new UnRAVLRuntime(); // drives configuration assertNotNull(r); String document = "{ \"s\": \"string\", \"b\": true, \"i\": 100, \"n\": 0.5, \"o\": { \"x\": 0, \"y\" : 0 }, \"a\": [ 0,1,2,3,4,5] }"; JsonNode node = Json.parse(document); ObjectMapper m = new ObjectMapper(); Object jo; if (node instanceof ObjectNode) jo = m.convertValue(node, Map.class); else // (node instanceof ArrayNode) jo = m.convertValue(node, List.class); // JsonPath parses strings into java.util.Map and java.util.List // objects. // If we have a Jackson JsonNode (an ObjectNode or an ArrayNode), we // must convert the Jackson types to Maps or Lists to use JsonPath. JsonProvider jp = Configuration.defaultConfiguration().jsonProvider(); assertNotNull(jo); String s = JsonPath.read(jo, "$.s"); Object o = JsonPath.read(jo, "$.o"); Object a = JsonPath.read(jo, "$.a"); assertTrue(s.equals("string")); assertNotNull(o); assertNotNull(a); assertTrue(jp.isMap(o)); assertTrue(jp.isArray(a)); ObjectNode on = m.valueToTree(o); ArrayNode an = m.valueToTree(a); assertNotNull(on); assertNotNull(an); assertEquals(2, on.size()); assertEquals(6, an.size()); } }