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;
8 import java.io.IOException;
9 import java.io.InputStream;
10 import java.util.Collections;
11 import java.util.Iterator;
12 import java.util.LinkedHashMap;
13 import java.util.LinkedList;
14 import java.util.List;
16 import java.util.NoSuchElementException;
17 import java.util.Spliterator;
18 import static java.util.Spliterator.IMMUTABLE;
19 import java.util.Spliterators;
20 import java.util.function.Consumer;
21 import java.util.stream.Stream;
22 import java.util.stream.StreamSupport;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
32 public class SimpleMapper
34 private static final Logger LOG =
35 LoggerFactory.getLogger(SimpleMapper.class);
38 private JsonFactory factory = new JsonFactory();
41 public static Stream<Object> getArrayStream(final JsonParser parser)
45 return StreamSupport.stream(getArraySpliterator(parser), false);
48 public static Spliterator<Object> getArraySpliterator(final JsonParser parser)
52 JsonToken token = parser.nextToken();
56 LOG.warn("empty input");
57 return Spliterators.emptySpliterator();
60 if (!JsonToken.START_ARRAY.equals(token))
61 fail(parser, "The root-element must be an array!");
63 return new Spliterator<Object>()
66 public boolean tryAdvance(Consumer<? super Object> action)
70 JsonToken token = parser.nextToken();
72 fail(parser, "Unexpected end of data!");
73 if (JsonToken.END_ARRAY.equals(token))
75 action.accept(convert(parser));
80 throw new IllegalArgumentException(e);
85 public Spliterator<Object> trySplit()
91 public long estimateSize()
93 return Long.MAX_VALUE;
97 public int characteristics()
104 public static Iterator<Object> getArrayIterator(final JsonParser parser)
108 Spliterator<Object> spliterator = getArraySpliterator(parser);
109 return new Iterator<Object>()
111 private Object next = null;
114 public boolean hasNext()
119 return spliterator.tryAdvance(new Consumer<Object>()
122 public void accept(Object o)
132 if (next == null && !hasNext())
133 throw new NoSuchElementException();
142 static Object convert(JsonParser parser) throws IOException
144 JsonToken token = parser.getCurrentToken();
146 fail(parser, "unexpected EOF");
150 case VALUE_STRING: return parser.getText();
151 case VALUE_NUMBER_INT: return parser.getIntValue();
152 case VALUE_NUMBER_FLOAT: return parser.getDoubleValue();
153 case START_OBJECT: return convertObject(parser);
154 case START_ARRAY: return convertArray(parser);
155 case VALUE_TRUE: return Boolean.TRUE;
156 case VALUE_FALSE: return Boolean.FALSE;
157 case VALUE_NULL: return null;
160 fail(parser, "unexpected token " + token.toString());
161 return null; // << Will never be reached, because fail always throws an exception
164 static Map<String, Object> convertObject(JsonParser parser) throws IOException
166 JsonToken token = parser.nextToken();
168 fail(parser, "unexpected EOF");
170 Map<String, Object> map = new LinkedHashMap<>();
172 while (!JsonToken.END_OBJECT.equals(token))
174 if (!JsonToken.FIELD_NAME.equals(token))
175 fail(parser, "expected a field-name");
177 String name = parser.getText();
179 Object value = convert(parser);
180 map.put(name, value);
182 token = parser.nextToken();
184 fail(parser, "unexpected EOF");
190 static List<Object> convertArray(JsonParser parser) throws IOException
192 JsonToken token = parser.nextToken();
194 fail(parser, "unexpected EOF");
196 List<Object> list = new LinkedList<>();
198 while (!JsonToken.END_ARRAY.equals(token))
200 list.add(convert(parser));
202 token = parser.nextToken();
204 fail(parser, "unexpected EOF");
210 static void fail(JsonParser parser, String message)
212 JsonLocation location = parser.getCurrentLocation();
214 "{} at char-offset {} (line {}, column {})",
216 location.getCharOffset(),
217 location.getLineNr(),
218 location.getColumnNr()
220 throw new IllegalArgumentException("Cannot parse JSON: " + message);