package com.tinkerpop.rexster.protocol.serializer.json.templates; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.BooleanNode; import org.codehaus.jackson.node.DoubleNode; import org.codehaus.jackson.node.IntNode; import org.codehaus.jackson.node.JsonNodeFactory; import org.codehaus.jackson.node.LongNode; import org.codehaus.jackson.node.NullNode; import org.codehaus.jackson.node.ObjectNode; import org.codehaus.jackson.node.TextNode; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * @author Blake Eggleston (bdeggleston.github.com) */ public class JsonConverter { /** * Recursively converts objects to json nodes * @param obj * @return */ public static JsonNode toJsonNode(Object obj) { if (obj == null) { return NullNode.getInstance(); } else if (obj instanceof Map) { ObjectNode map = new ObjectNode(JsonNodeFactory.instance); for (Map.Entry entry: ((Map<Object, Object>) obj).entrySet()) { map.put(entry.getKey().toString(), toJsonNode(entry.getValue())); } return map; } else if (obj instanceof Iterable) { ArrayNode array = new ArrayNode(JsonNodeFactory.instance); for (Object o: (Iterable) obj) { array.add(toJsonNode(o)); } return array; } else if (obj instanceof Object[]) { ArrayNode array = new ArrayNode(JsonNodeFactory.instance); for (Object o: (Object[]) obj) { array.add(toJsonNode(o)); } return array; } else if (obj instanceof Integer) { return new IntNode((Integer) obj); } else if (obj instanceof Long) { return new LongNode((Long) obj); } else if (obj instanceof Double) { return new DoubleNode((Double) obj); } else if (obj instanceof Float) { return new DoubleNode((Float) obj); } else if (obj instanceof Boolean) { return BooleanNode.valueOf((Boolean) obj); } else { return new TextNode(obj.toString()); } } /** * Recursively converts json nodes from json nodes to objects * @param node * @return */ public static Object fromJsonNode(JsonNode node) { if (node.isNull()) { return null; } else if (node.isObject()) { Map<String, Object> map = new HashMap<String, Object>(); ObjectNode objectNode = (ObjectNode) node; Iterator<String> iterator = objectNode.getFieldNames(); while (iterator.hasNext()) { String key = iterator.next(); map.put(key, fromJsonNode(objectNode.get(key))); } return map; } else if (node.isArray()) { ArrayNode arrayNode = (ArrayNode) node; ArrayList<Object> array = new ArrayList<Object>(); for (int i=0; i<arrayNode.size(); i++) { array.add(fromJsonNode(arrayNode.get(i))); } return array; } else if (node.isFloatingPointNumber()) { return node.asDouble(); } else if (node.isIntegralNumber()) { return node.asLong(); } else if (node.isBoolean()) { return node.asBoolean(); } else { return node.asText(); } } }