Improve handling of iterator, to make calling of hasNext() optional (or should it throw an exception?)
diff --git a/src/mapper/java/org/codehaus/jackson/map/MappingIterator.java b/src/mapper/java/org/codehaus/jackson/map/MappingIterator.java
index f981359..22505c9 100644
--- a/src/mapper/java/org/codehaus/jackson/map/MappingIterator.java
+++ b/src/mapper/java/org/codehaus/jackson/map/MappingIterator.java
@@ -135,23 +135,26 @@
if (_parser == null) {
return false;
}
- JsonToken t = _parser.getCurrentToken();
- if (t == null) { // un-initialized or cleared; find next
- if (!_hasNextChecked) {
+ if (!_hasNextChecked) {
+ JsonToken t = _parser.getCurrentToken();
+ _hasNextChecked = true;
+ if (t == null) { // un-initialized or cleared; find next
t = _parser.nextToken();
- _hasNextChecked = true;
- }
- // If EOF, no more
- if (t == null) {
- if (_closeParser) {
- _parser.close();
+ // If EOF, no more
+ if (t == null) {
+ JsonParser jp = _parser;
+ _parser = null;
+ if (_closeParser) {
+ jp.close();
+ }
+ return false;
}
- _parser = null;
- return false;
- }
- // And similarly if we hit END_ARRAY; except that we won't close parser
- if (t == JsonToken.END_ARRAY) {
- return false;
+ /* And similarly if we hit END_ARRAY; except that we won't close parser
+ * (because it's not a root-level iterator)
+ */
+ if (t == JsonToken.END_ARRAY) {
+ return false;
+ }
}
}
return true;
@@ -159,6 +162,12 @@
public T nextValue() throws IOException
{
+ // caller should always call 'hasNext[Value]' first; but let's ensure:
+ if (!_hasNextChecked) {
+ if (!hasNextValue()) {
+ throw new NoSuchElementException();
+ }
+ }
if (_parser == null) {
throw new NoSuchElementException();
}
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializationContext.java b/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializationContext.java
index 5345135..970ac14 100644
--- a/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializationContext.java
+++ b/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializationContext.java
@@ -238,11 +238,11 @@
* some String values are acceptable, but the one encountered is not
*/
@Override
- public JsonMappingException weirdStringException(Class<?> instClass, String msg)
+ public JsonMappingException weirdStringException(Class<?> instClass, String msg)
{
return JsonMappingException.from(_parser, "Can not construct instance of "+instClass.getName()+" from String value '"+_valueDesc()+"': "+msg);
}
-
+
@Override
public JsonMappingException weirdNumberException(Class<?> instClass, String msg)
{