1 package de.juplo.jackson;
4 import com.fasterxml.jackson.core.JsonFactory;
5 import com.fasterxml.jackson.core.JsonLocation;
6 import com.fasterxml.jackson.core.JsonParser;
7 import com.fasterxml.jackson.core.JsonToken;
9 import java.io.IOException;
10 import java.io.InputStream;
11 import java.io.Reader;
13 import java.util.Collections;
14 import java.util.Iterator;
15 import java.util.LinkedHashMap;
16 import java.util.LinkedList;
17 import java.util.List;
19 import java.util.Map.Entry;
20 import java.util.NoSuchElementException;
21 import java.util.Spliterator;
22 import static java.util.Spliterator.IMMUTABLE;
23 import java.util.Spliterators;
24 import java.util.function.Consumer;
25 import java.util.stream.Stream;
26 import java.util.stream.StreamSupport;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
36 public class SimpleMapper
38 private static final Logger LOG =
39 LoggerFactory.getLogger(SimpleMapper.class);
42 private final JsonFactory factory;
45 public SimpleMapper(JsonFactory factory)
47 this.factory = factory;
51 public Spliterator<Object> getArraySpliterator(File file)
55 return getArraySpliterator(factory.createParser(file));
58 public Spliterator<Object> getArraySpliterator(InputStream is)
62 return getArraySpliterator(factory.createParser(is));
65 public Spliterator<Object> getArraySpliterator(Reader r)
69 return getArraySpliterator(factory.createParser(r));
72 public Spliterator<Object> getArraySpliterator(String content)
76 return getArraySpliterator(factory.createParser(content));
79 public Spliterator<Object> getArraySpliterator(URL url)
83 return getArraySpliterator(factory.createParser(url));
86 public Spliterator<Object> getArraySpliterator(byte[] data)
90 return getArraySpliterator(factory.createParser(data));
93 public Spliterator<Object> getArraySpliterator(char[] content)
97 return getArraySpliterator(factory.createParser(content));
100 public Spliterator<Object> getArraySpliterator(byte[] data, int offset, int len)
104 return getArraySpliterator(factory.createParser(data, offset, len));
107 public Spliterator<Object> getArraySpliterator(char[] data, int offset, int len)
111 return getArraySpliterator(factory.createParser(data, offset, len));
114 public Stream<Object> getArrayStream(File file)
118 return getArrayStream(factory.createParser(file));
121 public Stream<Object> getArrayStream(InputStream is)
125 return getArrayStream(factory.createParser(is));
128 public Stream<Object> getArrayStream(Reader r)
132 return getArrayStream(factory.createParser(r));
135 public Stream<Object> getArrayStream(String content)
139 return getArrayStream(factory.createParser(content));
142 public Stream<Object> getArrayStream(URL url)
146 return getArrayStream(factory.createParser(url));
149 public Stream<Object> getArrayStream(byte[] data)
153 return getArrayStream(factory.createParser(data));
156 public Stream<Object> getArrayStream(char[] content)
160 return getArrayStream(factory.createParser(content));
163 public Stream<Object> getArrayStream(byte[] data, int offset, int len)
167 return getArrayStream(factory.createParser(data, offset, len));
170 public Stream<Object> getArrayStream(char[] data, int offset, int len)
174 return getArrayStream(factory.createParser(data, offset, len));
177 public Iterator<Object> getArrayIterator(File file)
181 return getArrayIterator(factory.createParser(file));
184 public Iterator<Object> getArrayIterator(InputStream is)
188 return getArrayIterator(factory.createParser(is));
191 public Iterator<Object> getArrayIterator(Reader r)
195 return getArrayIterator(factory.createParser(r));
198 public Iterator<Object> getArrayIterator(String content)
202 return getArrayIterator(factory.createParser(content));
205 public Iterator<Object> getArrayIterator(URL url)
209 return getArrayIterator(factory.createParser(url));
212 public Iterator<Object> getArrayIterator(byte[] data)
216 return getArrayIterator(factory.createParser(data));
219 public Iterator<Object> getArrayIterator(char[] content)
223 return getArrayIterator(factory.createParser(content));
226 public Iterator<Object> getArrayIterator(byte[] data, int offset, int len)
230 return getArrayIterator(factory.createParser(data, offset, len));
233 public Iterator<Object> getArrayIterator(char[] data, int offset, int len)
237 return getArrayIterator(factory.createParser(data, offset, len));
241 public Spliterator<Entry<String, Object>> getObjectSpliterator(File file)
245 return getObjectSpliterator(factory.createParser(file));
248 public Spliterator<Entry<String, Object>> getObjectSpliterator(InputStream is)
252 return getObjectSpliterator(factory.createParser(is));
255 public Spliterator<Entry<String, Object>> getObjectSpliterator(Reader r)
259 return getObjectSpliterator(factory.createParser(r));
262 public Spliterator<Entry<String, Object>> getObjectSpliterator(String content)
266 return getObjectSpliterator(factory.createParser(content));
269 public Spliterator<Entry<String, Object>> getObjectSpliterator(URL url)
273 return getObjectSpliterator(factory.createParser(url));
276 public Spliterator<Entry<String, Object>> getObjectSpliterator(byte[] data)
280 return getObjectSpliterator(factory.createParser(data));
283 public Spliterator<Entry<String, Object>> getObjectSpliterator(char[] content)
287 return getObjectSpliterator(factory.createParser(content));
290 public Spliterator<Entry<String, Object>> getObjectSpliterator(byte[] data, int offset, int len)
294 return getObjectSpliterator(factory.createParser(data, offset, len));
297 public Spliterator<Entry<String, Object>> getObjectSpliterator(char[] data, int offset, int len)
301 return getObjectSpliterator(factory.createParser(data, offset, len));
304 public Stream<Entry<String, Object>> getObjectStream(File file)
308 return getObjectStream(factory.createParser(file));
311 public Stream<Entry<String, Object>> getObjectStream(InputStream is)
315 return getObjectStream(factory.createParser(is));
318 public Stream<Entry<String, Object>> getObjectStream(Reader r)
322 return getObjectStream(factory.createParser(r));
325 public Stream<Entry<String, Object>> getObjectStream(String content)
329 return getObjectStream(factory.createParser(content));
332 public Stream<Entry<String, Object>> getObjectStream(URL url)
336 return getObjectStream(factory.createParser(url));
339 public Stream<Entry<String, Object>> getObjectStream(byte[] data)
343 return getObjectStream(factory.createParser(data));
346 public Stream<Entry<String, Object>> getObjectStream(char[] content)
350 return getObjectStream(factory.createParser(content));
353 public Stream<Entry<String, Object>> getObjectStream(byte[] data, int offset, int len)
357 return getObjectStream(factory.createParser(data, offset, len));
360 public Stream<Entry<String, Object>> getObjectStream(char[] data, int offset, int len)
364 return getObjectStream(factory.createParser(data, offset, len));
367 public Iterator<Entry<String, Object>> getObjectIterator(File file)
371 return getObjectIterator(factory.createParser(file));
374 public Iterator<Entry<String, Object>> getObjectIterator(InputStream is)
378 return getObjectIterator(factory.createParser(is));
381 public Iterator<Entry<String, Object>> getObjectIterator(Reader r)
385 return getObjectIterator(factory.createParser(r));
388 public Iterator<Entry<String, Object>> getObjectIterator(String content)
392 return getObjectIterator(factory.createParser(content));
395 public Iterator<Entry<String, Object>> getObjectIterator(URL url)
399 return getObjectIterator(factory.createParser(url));
402 public Iterator<Entry<String, Object>> getObjectIterator(byte[] data)
406 return getObjectIterator(factory.createParser(data));
409 public Iterator<Entry<String, Object>> getObjectIterator(char[] content)
413 return getObjectIterator(factory.createParser(content));
416 public Iterator<Entry<String, Object>> getObjectIterator(byte[] data, int offset, int len)
420 return getObjectIterator(factory.createParser(data, offset, len));
423 public Iterator<Entry<String, Object>> getObjectIterator(char[] data, int offset, int len)
427 return getObjectIterator(factory.createParser(data, offset, len));
431 public static Spliterator<Object> getArraySpliterator(final JsonParser parser)
435 JsonToken token = parser.nextToken();
439 LOG.warn("empty input");
440 return Spliterators.emptySpliterator();
443 if (!JsonToken.START_ARRAY.equals(token))
444 fail(parser, "The root-element must be an array!");
446 return new Spliterator<Object>()
449 public boolean tryAdvance(Consumer<? super Object> action)
453 JsonToken token = parser.nextToken();
455 fail(parser, "Unexpected end of data!");
456 if (JsonToken.END_ARRAY.equals(token))
458 if (parser.nextToken() != null)
459 fail(parser, "unexpected data after parsed array");
462 action.accept(convertInternal(parser));
465 catch (IOException e)
467 throw new IllegalArgumentException(e);
472 public Spliterator<Object> trySplit()
478 public long estimateSize()
480 return Long.MAX_VALUE;
484 public int characteristics()
491 public static Stream<Object> getArrayStream(final JsonParser parser)
495 return StreamSupport.stream(getArraySpliterator(parser), false);
498 public static Iterator<Object> getArrayIterator(final JsonParser parser)
502 Spliterator<Object> spliterator = getArraySpliterator(parser);
503 return new Iterator<Object>()
505 private Object next = null;
509 public boolean hasNext()
514 return spliterator.tryAdvance(new Consumer<Object>()
517 public void accept(Object o)
527 if (next == null && !hasNext())
528 throw new NoSuchElementException();
537 public static Spliterator<Entry<String, Object>> getObjectSpliterator(final JsonParser parser)
541 JsonToken token = parser.nextToken();
545 LOG.warn("empty input");
546 return Spliterators.emptySpliterator();
549 if (!JsonToken.START_OBJECT.equals(token))
550 fail(parser, "The root-element must be an object!");
552 return new Spliterator<Entry<String, Object>>()
555 public boolean tryAdvance(Consumer<? super Entry<String, Object>> action)
559 JsonToken token = parser.nextToken();
561 fail(parser, "Unexpected end of data!");
562 if (JsonToken.END_OBJECT.equals(token))
564 if (parser.nextToken() != null)
565 fail(parser, "unexpected data after parsed object");
568 if (!JsonToken.FIELD_NAME.equals(token))
569 fail(parser, "expected a field-name");
570 final String key = parser.getText();
572 final Object value = convertInternal(parser);
573 action.accept(new Entry<String, Object>()
576 public String getKey()
582 public Object getValue()
588 public Object setValue(Object value)
590 throw new UnsupportedOperationException("Not supported.");
595 catch (IOException e)
597 throw new IllegalArgumentException(e);
602 public Spliterator<Entry<String, Object>> trySplit()
608 public long estimateSize()
610 return Long.MAX_VALUE;
614 public int characteristics()
621 public static Stream<Entry<String, Object>> getObjectStream(final JsonParser parser)
625 return StreamSupport.stream(getObjectSpliterator(parser), false);
628 public static Iterator<Entry<String, Object>> getObjectIterator(
629 final JsonParser parser
634 Spliterator<Entry<String, Object>> spliterator = getObjectSpliterator(parser);
635 return new Iterator<Entry<String, Object>>()
637 private Entry<String, Object> next = null;
641 public boolean hasNext()
646 return spliterator.tryAdvance(new Consumer<Entry<String, Object>>()
649 public void accept(Entry<String, Object> e)
657 public Entry<String, Object> next()
659 if (next == null && !hasNext())
660 throw new NoSuchElementException();
661 Entry<String, Object> e = next;
669 public List<Object> convertArray(File file) throws Exception
671 return convertArray(factory.createParser(file));
674 public List<Object> convertArray(InputStream is) throws Exception
676 return convertArray(factory.createParser(is));
679 public List<Object> convertArray(Reader r) throws Exception
681 return convertArray(factory.createParser(r));
684 public List<Object> convertArray(String content) throws Exception
686 return convertArray(factory.createParser(content));
689 public List<Object> convertArray(URL url) throws Exception
691 return convertArray(factory.createParser(url));
694 public List<Object> convertArray(byte[] data) throws Exception
696 return convertArray(factory.createParser(data));
699 public List<Object> convertArray(char[] content) throws Exception
701 return convertArray(factory.createParser(content));
704 public List<Object> convertArray(byte[] data, int offset, int len)
708 return convertArray(factory.createParser(data, offset, len));
711 public List<Object> convertArray(char[] content, int offset, int len)
715 return convertArray(factory.createParser(content, offset, len));
718 public Map<String, Object> convertObject(File file) throws Exception
720 return convertObject(factory.createParser(file));
723 public Map<String, Object> convertObject(InputStream is) throws Exception
725 return convertObject(factory.createParser(is));
728 public Map<String, Object> convertObject(Reader r) throws Exception
730 return convertObject(factory.createParser(r));
733 public Map<String, Object> convertObject(String content) throws Exception
735 return convertObject(factory.createParser(content));
738 public Map<String, Object> convertObject(URL url) throws Exception
740 return convertObject(factory.createParser(url));
743 public Map<String, Object> convertObject(byte[] data) throws Exception
745 return convertObject(factory.createParser(data));
748 public Map<String, Object> convertObject(char[] content) throws Exception
750 return convertObject(factory.createParser(content));
753 public Map<String, Object> convertObject(byte[] data, int offset, int len)
757 return convertObject(factory.createParser(data, offset, len));
760 public Map<String, Object> convertObject(char[] content, int offset, int len)
764 return convertObject(factory.createParser(content, offset, len));
767 public Object convert(File file) throws Exception
769 return convert(factory.createParser(file));
772 public Object convert(InputStream is) throws Exception
774 return convert(factory.createParser(is));
777 public Object convert(Reader r) throws Exception
779 return convert(factory.createParser(r));
782 public Object convert(String content) throws Exception
784 return convert(factory.createParser(content));
787 public Object convert(URL url) throws Exception
789 return convert(factory.createParser(url));
792 public Object convert(byte[] data) throws Exception
794 return convert(factory.createParser(data));
797 public Object convert(char[] content) throws Exception
799 return convert(factory.createParser(content));
802 public Object convert(byte[] data, int offset, int len)
806 return convert(factory.createParser(data, offset, len));
809 public Object convert(char[] content, int offset, int len)
813 return convert(factory.createParser(content, offset, len));
817 static List<Object> convertArray(JsonParser parser) throws IOException
819 JsonToken token = parser.nextToken();
823 LOG.warn("empty input");
824 return Collections.EMPTY_LIST;
827 if (!JsonToken.START_ARRAY.equals(token))
828 fail(parser, "The root-element must be an array!");
830 List<Object> array = convertArrayInternal(parser);
832 if (parser.nextToken() != null)
833 fail(parser, "unexpected data after parsed array");
838 static Map<String, Object> convertObject(JsonParser parser) throws IOException
840 JsonToken token = parser.nextToken();
844 LOG.warn("empty input");
845 return Collections.EMPTY_MAP;
848 if (!JsonToken.START_OBJECT.equals(token))
849 fail(parser, "The root-element must be an object!");
851 Map<String, Object> object = convertObjectInternal(parser);
853 if (parser.nextToken() != null)
854 fail(parser, "unexpected data after parsed object");
859 static Object convert(JsonParser parser) throws IOException
861 JsonToken token = parser.nextToken();
865 LOG.warn("empty input");
875 fail(parser, "The root-element must be either an object or an array!");
878 Object object = convertInternal(parser);
880 if (parser.nextToken() != null)
881 fail(parser, "unexpected data after parsed object");
887 static Object convertInternal(JsonParser parser) throws IOException
889 JsonToken token = parser.getCurrentToken();
891 fail(parser, "unexpected EOF");
895 case VALUE_STRING: return parser.getText();
896 case VALUE_NUMBER_INT: return parser.getIntValue();
897 case VALUE_NUMBER_FLOAT: return parser.getDoubleValue();
898 case START_OBJECT: return convertObjectInternal(parser);
899 case START_ARRAY: return convertArrayInternal(parser);
900 case VALUE_TRUE: return Boolean.TRUE;
901 case VALUE_FALSE: return Boolean.FALSE;
902 case VALUE_NULL: return null;
905 fail(parser, "unexpected token " + token.toString());
906 return null; // << Will never be reached, because fail always throws an exception
910 static Map<String, Object> convertObjectInternal(JsonParser parser)
914 JsonToken token = parser.nextToken();
916 fail(parser, "unexpected EOF");
918 Map<String, Object> map = new LinkedHashMap<>();
920 while (!JsonToken.END_OBJECT.equals(token))
922 if (!JsonToken.FIELD_NAME.equals(token))
923 fail(parser, "expected a field-name");
925 String name = parser.getText();
927 Object value = convertInternal(parser);
928 map.put(name, value);
930 token = parser.nextToken();
932 fail(parser, "unexpected EOF");
938 static List<Object> convertArrayInternal(JsonParser parser) throws IOException
940 JsonToken token = parser.nextToken();
942 fail(parser, "unexpected EOF");
944 List<Object> list = new LinkedList<>();
946 while (!JsonToken.END_ARRAY.equals(token))
948 list.add(convertInternal(parser));
950 token = parser.nextToken();
952 fail(parser, "unexpected EOF");
959 static void fail(JsonParser parser, String message)
961 JsonLocation location = parser.getCurrentLocation();
963 "{} at char-offset {} (line {}, column {})",
965 location.getCharOffset(),
966 location.getLineNr(),
967 location.getColumnNr()
969 throw new IllegalArgumentException("Cannot parse JSON: " + message);