Mercurial > repos > rliterman > csp2
diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/json/JsonObject.java @ 68:5028fdace37b
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 16:23:26 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/json/JsonObject.java Tue Mar 18 16:23:26 2025 -0400 @@ -0,0 +1,371 @@ +package json; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +import structures.ByteBuilder; + +public class JsonObject { + + public static void main(String[] args){ + JsonObject bob=new JsonObject("name", "bob"); + JsonObject joe=new JsonObject("name", "joe"); + JsonObject sue=new JsonObject("name", "sue"); + JsonObject dan=new JsonObject("name", "dan"); + bob.add("joe", joe, true); + bob.add("sue", sue, true); + joe.add("dan", dan, true); + bob.add("a",1, true); + bob.add("b",2, true); + bob.add("c","3", true); + bob.add("a","4", true); + dan.add("e",5, true); + dan.add("f","6", true); + sue.add("g","7", true); + + System.out.println("dan:\n"+dan); + System.out.println("sue:\n"+sue); + System.out.println("joe:\n"+joe); + System.out.println("bob:\n"+bob); + + ArrayList<JsonObject> list=new ArrayList<JsonObject>(); + list.add(joe); + list.add(sue); + list.add(dan); + System.out.println("list:\n"+toString(list)); + } + + public JsonObject(){} + + public JsonObject(String key, Object value){ + add(key, value, true); + } + +// public JsonObject(String name_){ +// name=name_; +// } +// +// public JsonObject(String name_, String key, Object value){ +// name=name_; +// add(key, value); +// } + + /** Adds a formatted value with specified decimal places */ + public void addLiteral(String key0, double value, int decimals){ + if(omap==null){omap=new LinkedHashMap<String, Object>(8);} + omap.put(key0, new JsonLiteral(value, decimals)); + } + + /** Does not add quotes for strings. + * This method should be used with caution as it can produce incorrectly formatted files. */ + public void addLiteral(String key0, String value){ + if(omap==null){omap=new LinkedHashMap<String, Object>(8);} + omap.put(key0, new JsonLiteral(value)); + } + + public void add(String key0, Object value){add(key0, value, true);} + public void addAndRename(String key0, Object value){add(key0, value, false);} + + private void add(String key0, Object value, boolean replace){ + if(value!=null && value.getClass()==JsonObject.class){ + add(key0, (JsonObject)value, replace); + return; + } + int x=2; + String key=key0; + if(omap==null){omap=new LinkedHashMap<String, Object>(8);} + while(!replace && omap.containsKey(key)){ + key=key0+" "+x; + x++; + } + omap.put(key, value); + } + + public void add(String key0, JsonObject value){add(key0, value, true);} + public void addAndRename(String key0, JsonObject value){add(key0, value, false);} + + private void add(final String key0, JsonObject value, boolean replace){ + int x=2; + String key=key0; + if(jmap==null){jmap=new LinkedHashMap<String, JsonObject>(8);} + while(!replace && jmap.containsKey(key)){ + key=key0+" "+x; + x++; + } + jmap.put(key, value); + } + + public static String toString(ArrayList<JsonObject> list) { + ByteBuilder sb=new ByteBuilder(); + int commas=list.size()-1; + for(JsonObject j : list){ + j.append(0, sb, false); + if(commas>0){ + sb.append(",\n"); + } + commas--; + } + return sb.toString(); + } + + public ByteBuilder toText(){ + return toText(null, 0, false); + } + + public ByteBuilder toText(ByteBuilder sb, int level, boolean inArray){ + if(sb==null){sb=new ByteBuilder();} + append(level, sb, inArray); + return sb; + } + + public String toString(String name){ + ByteBuilder sb=new ByteBuilder(); + sb.append('{').append('\n'); + for(int i=0; i<padmult; i++){sb.append(' ');} + sb.append('"').append(name).append('"').append(':').append(' '); + toText(sb, 1, false); + sb.append('\n').append('}'); + return sb.toString(); + } + + public static String toString(Object[] array){ + ByteBuilder sb=new ByteBuilder(); + appendArray(sb, array, 0); + return sb.toString(); + } + + @Override + public String toString(){ + return toText(null, 0, false).toString(); + } + + public String toStringln(){ + return toText(null, 0, false).nl().toString(); + } + + public void append(int level, ByteBuilder sb, boolean inArray){ + int pad=padmult*level; + int pad2=padmult*(level+1); + + sb.append('{'); + if(!inArray){sb.append('\n');} + + int commas=(omap==null ? 0 : omap.size())+(jmap==null ? 0 : jmap.size())-1; + + if(omap!=null){ + for(Entry<String, Object> e : omap.entrySet()){ + String key=e.getKey(); + Object value=e.getValue(); + if(!inArray){for(int i=0; i<pad2; i++){sb.append(' ');}} + + appendEntry(sb, key, value, level, inArray); + + if(commas>0){sb.append(',');} + if(!inArray){sb.append('\n');} + commas--; + } + } + + if(jmap!=null){ + for(Entry<String, JsonObject> e : jmap.entrySet()){ + String key=e.getKey(); + JsonObject value=e.getValue(); + if(!inArray){for(int i=0; i<pad2; i++){sb.append(' ');}} + appendKey(sb, key); + + value.append(level+(inArray ? 0 : 1), sb, inArray); + if(commas>0){sb.append(',');} + if(!inArray){sb.append('\n');} + commas--; + } + } + + if(!inArray){for(int i=0; i<pad; i++){sb.append(' ');}} + sb.append('}'); + } + + private static void appendEntry(ByteBuilder sb, String key, Object value, int level, boolean inArray){ + appendKey(sb, key); + appendValue(sb, value, level, inArray); + } + + private static void appendKey(ByteBuilder sb, String key){ + sb.append('"').append(key).append("\": "); + } + + private static void appendValue(ByteBuilder sb, Object value, int level, boolean inArray){ + final Class<?> c=(value==null ? null : value.getClass()); + if(c==null || value==null){ + sb.append("null"); + }else if(c==String.class){ + sb.append("\"").append(value.toString()).append('"'); + }else if(c==JsonLiteral.class){ + sb.append(((JsonLiteral)value).toString()); + }else if(c==Double.class && restictDecimals>=0){ + sb.append(((Double)value).doubleValue(), restictDecimals); + }else if(c==Float.class && restictDecimals>=0){ + sb.append(((Float)value).floatValue(), restictDecimals); + }else if(c==JsonObject.class){ + ((JsonObject)value).append(level+(inArray ? 0 : 1), sb, inArray); + }else if(c.isArray()){ + appendArray(sb, (Object[])value, level); + }else if(c==Boolean.class || value instanceof Number){//long, int, boolean + sb.append(value.toString()); + }else if(value instanceof Collection){ + appendCollection(sb, (Collection<?>)value, level); + }else{//Default behavior for unhandled classes + sb.append("\"").append(value.toString()).append('"'); + } + } + + private static void appendArray(ByteBuilder sb, Object[] array, int level){ + int commas=(array==null ? 0 : array.length)-1; + sb.append('['); + if(array!=null){ + for(Object value : array){ + appendValue(sb, value, level, noNewlinesInArrays); + if(commas>0){sb.append(',').append(' ');} + commas--; + } + } + sb.append(']'); + } + + private static void appendCollection(ByteBuilder sb, Collection<?> stuff, int level){ + int commas=(stuff==null ? 0 : stuff.size())-1; + sb.append('['); + if(stuff!=null){ + for(Object value : stuff){ + appendValue(sb, value, level, noNewlinesInArrays); + if(commas>0){sb.append(',').append(' ');} + commas--; + } + } + sb.append(']'); + } + + public String getString(String key){ + if(omap==null){return null;} + Object o=omap.get(key); + if(o==null){return null;} + assert(o.getClass()==String.class) : "Wrong class: "+o.getClass()+"\n"+o; + return (String)o; + } + + public Long getLong(String key){ + if(omap==null){return null;} + Object o=omap.get(key); + if(o==null){return null;} + assert(o.getClass()==Long.class) : "Wrong class: "+o.getClass()+"\n"+o; + return (Long)o; + } + + public Integer getInt(String key){ + assert(omap!=null); + Object o=omap.get(key); +// assert(o!=null); + assert(o==null || o.getClass()==Integer.class) : "Wrong class: "+o.getClass()+"\n"+o; +// long x=((Long)o).longValue(); +// assert(x>=Integer.MIN_VALUE && x<=Integer.MAX_VALUE); +// return (int)x; + return (Integer)o; + } + + public boolean containsKey(String key){ + if(omap!=null && omap.containsKey(key)){return true;} + if(jmap!=null && jmap.containsKey(key)){return true;} + return false; + } + +// public Double getDouble(String key){ +// if(smap==null){return null;} +// Object o=smap.get(key); +// if(o==null){return null;} +// assert(o.getClass()==Double.class) : "Wrong class: "+o.getClass()+"\n"+o; +// return (Double)o; +// } + + public Double getDouble(String key){ + if(omap==null){return null;} + Object o=omap.get(key); + if(o==null){return null;} + if(o.getClass()==Long.class){ + return ((Long)o).doubleValue(); + } + assert(o.getClass()==Double.class) : "Wrong class: "+o.getClass()+"\n"+o; + return (Double)o; + } + + public Number getNumber(String key){ + if(omap==null){return null;} + Object o=omap.get(key); + if(o==null){return null;} + Class<?> c=o.getClass(); + assert(c==Double.class || c==Long.class || c==Integer.class || c==Float.class) : "Wrong class: "+c+"\n"+o; + return (Number)o; + } + + public Object[] getArray(String key){ + if(omap==null){return null;} + Object o=omap.get(key); + if(o==null){return null;} + assert(o.getClass()==Object[].class) : "Wrong class: "+o.getClass()+"\n"+o; + return (Object[])o; + } + + public JsonObject getJson(String key){ + if(jmap==null){return null;} + return jmap.get(key); + } + + public JsonObject removeJson(String key){ + if(jmap==null){return null;} + return jmap.remove(key); + } + + public Object removeObject(String key){ + if(omap==null){return null;} + return omap.remove(key); + } + + public void clearJson(){ + jmap=null; + } + + public void clearOmap(){ + omap=null; + } + + public Object[] toJmapArray() { + if(jmap==null){return null;} + Object[] array=new Object[jmapSize()]; + int i=0; + for(Entry<String, JsonObject> e : jmap.entrySet()){ + array[i]=e.getValue(); + i++; + } + return array; + } + + public int jmapSize(){return jmap==null ? 0 : jmap.size();} + public int omapSize(){return omap==null ? 0 : omap.size();} + +// public String name; + public LinkedHashMap<String, Object> omap; + public LinkedHashMap<String, JsonObject> jmap; + + private static int restictDecimals=-1; + private static String decimalFormat="%."+restictDecimals+"f"; + public static synchronized void setDecimals(int d){ + if(d!=restictDecimals){ + d=restictDecimals; + decimalFormat="%."+restictDecimals+"f"; + } + } + + public static final int padmult=3; + public static boolean noNewlinesInArrays=false; + +}