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.Iterator;
14 import java.util.LinkedHashMap;
15 import java.util.LinkedList;
16 import java.util.List;
18 import java.util.Map.Entry;
19 import java.util.NoSuchElementException;
20 import java.util.Spliterator;
21 import static java.util.Spliterator.IMMUTABLE;
22 import java.util.Spliterators;
23 import java.util.function.Consumer;
24 import java.util.stream.Stream;
25 import java.util.stream.StreamSupport;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
35 public class SimpleMapper
37 private static final Logger LOG =
38 LoggerFactory.getLogger(SimpleMapper.class);
41 private final JsonFactory factory;
44 public SimpleMapper(JsonFactory factory)
46 this.factory = factory;
50 public Spliterator<Object> getArraySpliterator(File file)
54 return getArraySpliterator(factory.createParser(file));
57 public Spliterator<Object> getArraySpliterator(InputStream is)
61 return getArraySpliterator(factory.createParser(is));
64 public Spliterator<Object> getArraySpliterator(Reader r)
68 return getArraySpliterator(factory.createParser(r));
71 public Spliterator<Object> getArraySpliterator(String content)
75 return getArraySpliterator(factory.createParser(content));
78 public Spliterator<Object> getArraySpliterator(URL url)
82 return getArraySpliterator(factory.createParser(url));
85 public Spliterator<Object> getArraySpliterator(byte[] data)
89 return getArraySpliterator(factory.createParser(data));
92 public Spliterator<Object> getArraySpliterator(char[] content)
96 return getArraySpliterator(factory.createParser(content));
99 public Spliterator<Object> getArraySpliterator(byte[] data, int offset, int len)
103 return getArraySpliterator(factory.createParser(data, offset, len));
106 public Spliterator<Object> getArraySpliterator(char[] data, int offset, int len)
110 return getArraySpliterator(factory.createParser(data, offset, len));
113 public Stream<Object> getArrayStream(File file)
117 return getArrayStream(factory.createParser(file));
120 public Stream<Object> getArrayStream(InputStream is)
124 return getArrayStream(factory.createParser(is));
127 public Stream<Object> getArrayStream(Reader r)
131 return getArrayStream(factory.createParser(r));
134 public Stream<Object> getArrayStream(String content)
138 return getArrayStream(factory.createParser(content));
141 public Stream<Object> getArrayStream(URL url)
145 return getArrayStream(factory.createParser(url));
148 public Stream<Object> getArrayStream(byte[] data)
152 return getArrayStream(factory.createParser(data));
155 public Stream<Object> getArrayStream(char[] content)
159 return getArrayStream(factory.createParser(content));
162 public Stream<Object> getArrayStream(byte[] data, int offset, int len)
166 return getArrayStream(factory.createParser(data, offset, len));
169 public Stream<Object> getArrayStream(char[] data, int offset, int len)
173 return getArrayStream(factory.createParser(data, offset, len));
176 public Iterator<Object> getArrayIterator(File file)
180 return getArrayIterator(factory.createParser(file));
183 public Iterator<Object> getArrayIterator(InputStream is)
187 return getArrayIterator(factory.createParser(is));
190 public Iterator<Object> getArrayIterator(Reader r)
194 return getArrayIterator(factory.createParser(r));
197 public Iterator<Object> getArrayIterator(String content)
201 return getArrayIterator(factory.createParser(content));
204 public Iterator<Object> getArrayIterator(URL url)
208 return getArrayIterator(factory.createParser(url));
211 public Iterator<Object> getArrayIterator(byte[] data)
215 return getArrayIterator(factory.createParser(data));
218 public Iterator<Object> getArrayIterator(char[] content)
222 return getArrayIterator(factory.createParser(content));
225 public Iterator<Object> getArrayIterator(byte[] data, int offset, int len)
229 return getArrayIterator(factory.createParser(data, offset, len));
232 public Iterator<Object> getArrayIterator(char[] data, int offset, int len)
236 return getArrayIterator(factory.createParser(data, offset, len));
240 public Spliterator<Entry<String, Object>> getObjectSpliterator(File file)
244 return getObjectSpliterator(factory.createParser(file));
247 public Spliterator<Entry<String, Object>> getObjectSpliterator(InputStream is)
251 return getObjectSpliterator(factory.createParser(is));
254 public Spliterator<Entry<String, Object>> getObjectSpliterator(Reader r)
258 return getObjectSpliterator(factory.createParser(r));
261 public Spliterator<Entry<String, Object>> getObjectSpliterator(String content)
265 return getObjectSpliterator(factory.createParser(content));
268 public Spliterator<Entry<String, Object>> getObjectSpliterator(URL url)
272 return getObjectSpliterator(factory.createParser(url));
275 public Spliterator<Entry<String, Object>> getObjectSpliterator(byte[] data)
279 return getObjectSpliterator(factory.createParser(data));
282 public Spliterator<Entry<String, Object>> getObjectSpliterator(char[] content)
286 return getObjectSpliterator(factory.createParser(content));
289 public Spliterator<Entry<String, Object>> getObjectSpliterator(byte[] data, int offset, int len)
293 return getObjectSpliterator(factory.createParser(data, offset, len));
296 public Spliterator<Entry<String, Object>> getObjectSpliterator(char[] data, int offset, int len)
300 return getObjectSpliterator(factory.createParser(data, offset, len));
303 public Stream<Entry<String, Object>> getObjectStream(File file)
307 return getObjectStream(factory.createParser(file));
310 public Stream<Entry<String, Object>> getObjectStream(InputStream is)
314 return getObjectStream(factory.createParser(is));
317 public Stream<Entry<String, Object>> getObjectStream(Reader r)
321 return getObjectStream(factory.createParser(r));
324 public Stream<Entry<String, Object>> getObjectStream(String content)
328 return getObjectStream(factory.createParser(content));
331 public Stream<Entry<String, Object>> getObjectStream(URL url)
335 return getObjectStream(factory.createParser(url));
338 public Stream<Entry<String, Object>> getObjectStream(byte[] data)
342 return getObjectStream(factory.createParser(data));
345 public Stream<Entry<String, Object>> getObjectStream(char[] content)
349 return getObjectStream(factory.createParser(content));
352 public Stream<Entry<String, Object>> getObjectStream(byte[] data, int offset, int len)
356 return getObjectStream(factory.createParser(data, offset, len));
359 public Stream<Entry<String, Object>> getObjectStream(char[] data, int offset, int len)
363 return getObjectStream(factory.createParser(data, offset, len));
366 public Iterator<Entry<String, Object>> getObjectIterator(File file)
370 return getObjectIterator(factory.createParser(file));
373 public Iterator<Entry<String, Object>> getObjectIterator(InputStream is)
377 return getObjectIterator(factory.createParser(is));
380 public Iterator<Entry<String, Object>> getObjectIterator(Reader r)
384 return getObjectIterator(factory.createParser(r));
387 public Iterator<Entry<String, Object>> getObjectIterator(String content)
391 return getObjectIterator(factory.createParser(content));
394 public Iterator<Entry<String, Object>> getObjectIterator(URL url)
398 return getObjectIterator(factory.createParser(url));
401 public Iterator<Entry<String, Object>> getObjectIterator(byte[] data)
405 return getObjectIterator(factory.createParser(data));
408 public Iterator<Entry<String, Object>> getObjectIterator(char[] content)
412 return getObjectIterator(factory.createParser(content));
415 public Iterator<Entry<String, Object>> getObjectIterator(byte[] data, int offset, int len)
419 return getObjectIterator(factory.createParser(data, offset, len));
422 public Iterator<Entry<String, Object>> getObjectIterator(char[] data, int offset, int len)
426 return getObjectIterator(factory.createParser(data, offset, len));
430 public static Spliterator<Object> getArraySpliterator(final JsonParser parser)
434 JsonToken token = parser.nextToken();
438 LOG.warn("empty input");
439 return Spliterators.emptySpliterator();
442 if (!JsonToken.START_ARRAY.equals(token))
443 fail(parser, "The root-element must be an array!");
445 return new Spliterator<Object>()
448 public boolean tryAdvance(Consumer<? super Object> action)
452 JsonToken token = parser.nextToken();
454 fail(parser, "Unexpected end of data!");
455 if (JsonToken.END_ARRAY.equals(token))
457 action.accept(convert(parser));
460 catch (IOException e)
462 throw new IllegalArgumentException(e);
467 public Spliterator<Object> trySplit()
473 public long estimateSize()
475 return Long.MAX_VALUE;
479 public int characteristics()
486 public static Stream<Object> getArrayStream(final JsonParser parser)
490 return StreamSupport.stream(getArraySpliterator(parser), false);
493 public static Iterator<Object> getArrayIterator(final JsonParser parser)
497 Spliterator<Object> spliterator = getArraySpliterator(parser);
498 return new Iterator<Object>()
500 private Object next = null;
504 public boolean hasNext()
509 return spliterator.tryAdvance(new Consumer<Object>()
512 public void accept(Object o)
522 if (next == null && !hasNext())
523 throw new NoSuchElementException();
532 public static Spliterator<Entry<String, Object>> getObjectSpliterator(final JsonParser parser)
536 JsonToken token = parser.nextToken();
540 LOG.warn("empty input");
541 return Spliterators.emptySpliterator();
544 if (!JsonToken.START_OBJECT.equals(token))
545 fail(parser, "The root-element must be an array!");
547 return new Spliterator<Entry<String, Object>>()
550 public boolean tryAdvance(Consumer<? super Entry<String, Object>> action)
554 JsonToken token = parser.nextToken();
556 fail(parser, "Unexpected end of data!");
557 if (JsonToken.END_OBJECT.equals(token))
559 if (!JsonToken.FIELD_NAME.equals(token))
560 fail(parser, "expected a field-name");
561 final String key = parser.getText();
563 final Object value = convert(parser);
564 action.accept(new Entry<String, Object>()
567 public String getKey()
573 public Object getValue()
579 public Object setValue(Object value)
581 throw new UnsupportedOperationException("Not supported.");
586 catch (IOException e)
588 throw new IllegalArgumentException(e);
593 public Spliterator<Entry<String, Object>> trySplit()
599 public long estimateSize()
601 return Long.MAX_VALUE;
605 public int characteristics()
612 public static Stream<Entry<String, Object>> getObjectStream(final JsonParser parser)
616 return StreamSupport.stream(getObjectSpliterator(parser), false);
619 public static Iterator<Entry<String, Object>> getObjectIterator(
620 final JsonParser parser
625 Spliterator<Entry<String, Object>> spliterator = getObjectSpliterator(parser);
626 return new Iterator<Entry<String, Object>>()
628 private Entry<String, Object> next = null;
632 public boolean hasNext()
637 return spliterator.tryAdvance(new Consumer<Entry<String, Object>>()
640 public void accept(Entry<String, Object> e)
648 public Entry<String, Object> next()
650 if (next == null && !hasNext())
651 throw new NoSuchElementException();
652 Entry<String, Object> e = next;
660 public static Object convert(JsonParser parser) throws IOException
662 JsonToken token = parser.getCurrentToken();
664 fail(parser, "unexpected EOF");
668 case VALUE_STRING: return parser.getText();
669 case VALUE_NUMBER_INT: return parser.getIntValue();
670 case VALUE_NUMBER_FLOAT: return parser.getDoubleValue();
671 case START_OBJECT: return convertObject(parser);
672 case START_ARRAY: return convertArray(parser);
673 case VALUE_TRUE: return Boolean.TRUE;
674 case VALUE_FALSE: return Boolean.FALSE;
675 case VALUE_NULL: return null;
678 fail(parser, "unexpected token " + token.toString());
679 return null; // << Will never be reached, because fail always throws an exception
683 static Map<String, Object> convertObject(JsonParser parser) throws IOException
685 JsonToken token = parser.nextToken();
687 fail(parser, "unexpected EOF");
689 Map<String, Object> map = new LinkedHashMap<>();
691 while (!JsonToken.END_OBJECT.equals(token))
693 if (!JsonToken.FIELD_NAME.equals(token))
694 fail(parser, "expected a field-name");
696 String name = parser.getText();
698 Object value = convert(parser);
699 map.put(name, value);
701 token = parser.nextToken();
703 fail(parser, "unexpected EOF");
709 static List<Object> convertArray(JsonParser parser) throws IOException
711 JsonToken token = parser.nextToken();
713 fail(parser, "unexpected EOF");
715 List<Object> list = new LinkedList<>();
717 while (!JsonToken.END_ARRAY.equals(token))
719 list.add(convert(parser));
721 token = parser.nextToken();
723 fail(parser, "unexpected EOF");
730 static void fail(JsonParser parser, String message)
732 JsonLocation location = parser.getCurrentLocation();
734 "{} at char-offset {} (line {}, column {})",
736 location.getCharOffset(),
737 location.getLineNr(),
738 location.getColumnNr()
740 throw new IllegalArgumentException("Cannot parse JSON: " + message);