/* * Copyright 2010 Outerthought bvba * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.lilyproject.util.json; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.ObjectNode; public class JsonUtil { private JsonUtil() { } public static JsonNode getNode(JsonNode node, String prop) throws JsonFormatException { if (node.get(prop) == null) { throw new JsonFormatException("Missing required property: " + prop); } return node.get(prop); } public static ArrayNode getArray(JsonNode node, String prop) throws JsonFormatException { if (node.get(prop) == null) { throw new JsonFormatException("Missing required property: " + prop); } if (!node.get(prop).isArray()) { throw new JsonFormatException("Not an array property: " + prop); } return (ArrayNode)node.get(prop); } public static ArrayNode getArray(JsonNode node, String prop, ArrayNode defaultValue) throws JsonFormatException { if (node.get(prop) == null) { return defaultValue; } if (!node.get(prop).isArray()) { throw new JsonFormatException("Not an array property: " + prop); } return (ArrayNode)node.get(prop); } public static ObjectNode getObject(JsonNode node, String prop) throws JsonFormatException { if (node.get(prop) == null) { throw new JsonFormatException("Missing required property: " + prop); } if (!node.get(prop).isObject()) { throw new JsonFormatException("Not an object property: " + prop); } return (ObjectNode)node.get(prop); } public static ObjectNode getObject(JsonNode node, String prop, ObjectNode defaultValue) throws JsonFormatException { if (node.get(prop) == null) { return defaultValue; } if (!node.get(prop).isObject()) { throw new JsonFormatException("Not an object property: " + prop); } return (ObjectNode)node.get(prop); } public static String getString(JsonNode node, String prop) throws JsonFormatException { if (node.get(prop) == null) { throw new JsonFormatException("Missing required property: " + prop); } if (!node.get(prop).isTextual()) { throw new JsonFormatException("Not a string property: " + prop); } return node.get(prop).getTextValue(); } public static String getString(JsonNode node, String prop, String defaultValue) throws JsonFormatException { if (node.get(prop) == null) { return defaultValue; } if (!node.get(prop).isTextual()) { throw new JsonFormatException("Not a string property: " + prop); } return node.get(prop).getTextValue(); } public static boolean getBoolean(JsonNode node, String prop, boolean defaultValue) throws JsonFormatException { if (node.get(prop) == null) { return defaultValue; } if (!node.get(prop).isBoolean()) { throw new JsonFormatException("Not a string property: " + prop); } return node.get(prop).getBooleanValue(); } public static boolean getBoolean(JsonNode node, String prop) throws JsonFormatException { if (node.get(prop) == null) { throw new JsonFormatException("Missing required property: " + prop); } if (!node.get(prop).isBoolean()) { throw new JsonFormatException("Not a string property: " + prop); } return node.get(prop).getBooleanValue(); } public static int getInt(JsonNode node, String prop, int defaultValue) throws JsonFormatException { if (node.get(prop) == null) { return defaultValue; } if (!node.get(prop).isInt()) { throw new JsonFormatException("Not an integer property: " + prop); } return node.get(prop).getIntValue(); } public static int getInt(JsonNode node, String prop) throws JsonFormatException { if (node.get(prop) == null) { throw new JsonFormatException("Missing required property: " + prop); } if (!node.get(prop).isInt()) { throw new JsonFormatException("Not an integer property: " + prop); } return node.get(prop).getIntValue(); } public static long getLong(JsonNode node, String prop) throws JsonFormatException { if (node.get(prop) == null) { throw new JsonFormatException("Missing required property: " + prop); } if (!node.get(prop).isLong() && !node.get(prop).isInt()) { throw new JsonFormatException("Not an long property: " + prop); } return node.get(prop).getLongValue(); } public static Long getLong(JsonNode node, String prop, Long defaultValue) throws JsonFormatException { if (node.get(prop) == null) { return defaultValue; } if (!node.get(prop).isLong() && !node.get(prop).isInt()) { throw new JsonFormatException("Not an long property: " + prop); } return node.get(prop).getLongValue(); } public static Double getDouble(JsonNode node, String prop, Double defaultValue) throws JsonFormatException { if (node.get(prop) == null) { return defaultValue; } if (!node.get(prop).isLong() && !node.get(prop).isDouble()) { throw new JsonFormatException("Not a double property: " + prop); } return node.get(prop).getDoubleValue(); } public static byte[] getBinary(JsonNode node, String prop) throws JsonFormatException { if (node.get(prop) == null) { throw new JsonFormatException("Missing required property: " + prop); } try { return node.get(prop).getBinaryValue(); } catch (IOException e) { throw new JsonFormatException("Error reading binary data in property " + prop, e); } } public static byte[] getBinary(JsonNode node, String prop, byte[] defaultValue) throws JsonFormatException { if (node.get(prop) == null) { return defaultValue; } try { return node.get(prop).getBinaryValue(); } catch (IOException e) { throw new JsonFormatException("Error reading binary data in property " + prop, e); } } public static List<String> getStrings(JsonNode node, String prop, List<String> defaultValue) throws JsonFormatException { ArrayNode arrayNode = getArray(node, prop, null); if (arrayNode == null) { return defaultValue; } List<String> elements = new ArrayList<String>(); Iterator<JsonNode> elementItr = arrayNode.getElements(); while (elementItr.hasNext()) { elements.add(elementItr.next().asText()); } return elements; } public static <T extends Enum<T>> T getEnum(JsonNode node, String prop, Class<T> enumClass) { String value = getString(node, prop); try { return Enum.valueOf(enumClass, value.toUpperCase()); } catch (IllegalArgumentException e) { throw new JsonFormatException("Unrecognized value for enum " + enumClass.getSimpleName() + ": '" + value + "'."); } } }