diff --git a/datastructures-json-tiny/src/main/java/org/xbib/datastructures/json/tiny/Json.java b/datastructures-json-tiny/src/main/java/org/xbib/datastructures/json/tiny/Json.java index 34e1ebd..76eb654 100644 --- a/datastructures-json-tiny/src/main/java/org/xbib/datastructures/json/tiny/Json.java +++ b/datastructures-json-tiny/src/main/java/org/xbib/datastructures/json/tiny/Json.java @@ -56,10 +56,17 @@ public class Json implements DataStructure { } public static Map toMap(Reader reader) throws IOException { + Objects.requireNonNull(reader); + StringWriter writer = new StringWriter(); + reader.transferTo(writer); + return toMap(writer.toString()); + } + + public static Map toModifiableMap(Reader reader) throws IOException { Objects.requireNonNull(reader); // buffered reader is required for mark() support try (BufferedReader bufferedReader = new BufferedReader(reader)){ - return JsonGenerator.toMap(INSTANCE.createParser().parse(bufferedReader)); + return JsonGenerator.toModifiableMap(INSTANCE.createParser().parse(bufferedReader)); } } diff --git a/datastructures-json-tiny/src/main/java/org/xbib/datastructures/json/tiny/JsonGenerator.java b/datastructures-json-tiny/src/main/java/org/xbib/datastructures/json/tiny/JsonGenerator.java index 056de1c..bde92bb 100644 --- a/datastructures-json-tiny/src/main/java/org/xbib/datastructures/json/tiny/JsonGenerator.java +++ b/datastructures-json-tiny/src/main/java/org/xbib/datastructures/json/tiny/JsonGenerator.java @@ -34,6 +34,11 @@ public class JsonGenerator implements Generator { return (Map) internalMap(root); } + @SuppressWarnings("unchecked") + public static Map toModifiableMap(Node root) { + return (Map) internalModifiableMap(root); + } + private void internalWrite(Node curnode) throws IOException { if (curnode instanceof ValueNode) { ValueNode valueNode = (ValueNode) curnode; @@ -79,4 +84,27 @@ public class JsonGenerator implements Generator { return null; } } + + private static Object internalModifiableMap(Node curnode) { + if (curnode instanceof ValueNode) { + ValueNode valueNode = (ValueNode) curnode; + return valueNode.get(); + } else if (curnode instanceof MapNode) { + MapNode mapNode = (MapNode) curnode; + TinyMap.Builder map = TinyMap.builder(); + for (Map.Entry> e : mapNode.get().entrySet()) { + map.put(e.getKey().toString(), internalMap(e.getValue())); + } + return map; + } else if (curnode instanceof ListNode) { + ListNode listNode = (ListNode) curnode; + TinyList.Builder list = TinyList.builder(); + for (Node node : listNode.get()) { + list.add(internalMap(node)); + } + return list; + } else { + return null; + } + } }