/******************************************************************************* * Copyright 2012 University of Southern California * * 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. * * This code was developed by the Information Integration Group as part * of the Karma project at the Information Sciences Institute of the * University of Southern California. For more information, publications, * and related projects, please see: http://www.isi.edu/integration ******************************************************************************/ package edu.isi.karma.util; import java.io.BufferedReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.Reader; import java.util.Iterator; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JSONUtil { private static Logger logger = LoggerFactory.getLogger(JSONUtil.class); public static String enclose(String x, String delimiter) { return delimiter + x + delimiter; } public static String doubleQuote(String x) { return enclose(x, "\""); } public static String jsonLast(Enum<?> key, String value) { return doubleQuote(key.name()) + " : " + JSONObject.quote(value); } public static String jsonLast(Enum<?> key, int value) { return doubleQuote(key.name()) + " : " + value; } public static String jsonLast(Enum<?> key, boolean value) { return doubleQuote(key.name()) + " : " + value; } public static String json(Enum<?> key, String value) { return doubleQuote(key.name()) + " : " + JSONObject.quote(value) + " , "; } public static String json(Enum<?> key, boolean value) { return doubleQuote(key.name()) + " : " + value + " , "; } public static String json(Enum<?> key, int value) { return doubleQuote(key.name()) + " : " + value + " , "; } public static String jsonStartList(Enum<?> key) { return JSONUtil.doubleQuote(key.name()) + " : ["; } public static String jsonStartObject(Enum<?> key) { return JSONUtil.doubleQuote(key.name()) + " : "; } public static String truncateForHeader(String x, int maxChars) { if (x.length() > maxChars) { if (maxChars > 5) { String prefix = x.substring(0, maxChars - 5); String suffix = x.substring(x.length() - 3, x.length()); return prefix + ".." + suffix; } else { return x.substring(0, maxChars - 2) + ".."; } } else { return x; } } public static String truncateCellValue(String x, int maxChars) { if (x.length() > maxChars) { return x.substring(0, Math.max(3, maxChars)) + " ..."; } else { return x; } } public static String readerToString(Reader reader) { StringBuffer fileData = new StringBuffer(1000); BufferedReader bufferedReader = new BufferedReader(reader); char[] buf = new char[1024]; int numRead = 0; try { while ((numRead = bufferedReader.read(buf)) != -1) { String readData = String.valueOf(buf, 0, numRead); fileData.append(readData); buf = new char[1024]; } bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return fileData.toString(); } private static JSONArray createJSONArray(JSONTokener tokener) { JSONArray result = null; try { result = new JSONArray(tokener); } catch (JSONException e1) { // Don't do anything. } return result; } private static JSONObject createJSONObject(JSONTokener tokener) { JSONObject result = null; try { result = new JSONObject(tokener); } catch (JSONException e1) { // Don't do anything. } return result; } public static Object createJson(String jsonString) { Object result = createJSONObject(new JSONTokener(jsonString)); if (result == null) { result = createJSONArray(new JSONTokener(jsonString)); } if (result == null) { logger.error("Could not parse as JSONObject or JSONArray"); } return result; } public static Object createJson(Reader reader) { // This is an ugly, and surely inefficient solution, but I can't figure // out a way around it. String x = readerToString(reader); return createJson(x); } public static String prettyPrintJson(String jsonString) { try { Object o = createJson(jsonString); if (o instanceof JSONObject) { return ((JSONObject) o).toString(4); } else if (o instanceof JSONArray) { return ((JSONArray) o).toString(4); } else { return "not JSON"; } } catch (JSONException e) { e.printStackTrace(); return "not JSON"; } } public static boolean compareJSONObjects(Object obj1, Object obj2) throws JSONException { if(obj1 instanceof JSONArray && obj2 instanceof JSONArray) { JSONArray a1 = (JSONArray) obj1; JSONArray a2 = (JSONArray) obj2; if(a1.length() != a2.length()) return false; for (int i=0; i<a1.length(); i++) { Object a = a1.get(i); Object b = a2.get(i); if(!compareJSONObjects(a, b)) return false; } } else if (obj1 instanceof JSONObject && obj2 instanceof JSONObject) { JSONObject a1 = (JSONObject) obj1; JSONObject a2 = (JSONObject) obj2; if(a1.length() != a2.length()) return false; @SuppressWarnings("rawtypes") Iterator keys = a1.keys(); while (keys.hasNext()) { String key = (String) keys.next(); Object val1 = a1.get(key); Object val2 = null; try { val2 = a2.get(key); } catch (JSONException e) { return false; } if(!compareJSONObjects(val1, val2)) return false; } } else if (obj1 instanceof String && obj2 instanceof String) { return obj1.toString().equals(obj2.toString()); } else if (obj1 instanceof Integer && obj2 instanceof Integer) { return (Integer)obj1 == (Integer)obj2; } else if (obj1 instanceof Double && obj2 instanceof Double) { return (Double)obj1 == (Double)obj2; } else if (obj1 instanceof Long && obj2 instanceof Long) { return (Long)obj1 == (Long)obj2; } else if (obj1 instanceof Boolean && obj2 instanceof Boolean) { return (Boolean)obj1 == (Boolean)obj2; } else if (obj1 == JSONObject.NULL && obj2 == JSONObject.NULL) { return true; } else return false; return true; } public static void writeJsonFile(Object o, String name) { try { FileWriter outFile = new FileWriter(name); PrintWriter pw = new PrintWriter(outFile); if (o instanceof JSONObject) { JSONObject x = (JSONObject) o; pw.println(x.toString(2)); } else if (o instanceof JSONArray) { JSONArray x = (JSONArray) o; pw.println(x.toString(2)); } outFile.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }