protected override JsonToken ReadTokenImpl()
{
JsonReader baseReader = _reader;
int index = _index;
if (index < 0)
{
//
// If the base reader was never started then do it now.
// Check for zero depth is the same as BOF.
//
if (baseReader.Depth == 0)
{
baseReader.ReadToken(JsonTokenClass.Object);
_innerDepth = baseReader.Depth;
}
_index = 0;
return JsonToken.Object();
}
//
// Buffered members, if any, get served first.
//
NamedJsonBufferList bufferedMembers = _bufferedMembers;
if (bufferedMembers != null && index < bufferedMembers.Count)
{
//
// Is there a value to serve?
//
JsonBuffer value = _memberValue;
if (!value.IsEmpty)
{
if (value.IsStructured) // JSON Array or Object
{
//
// Get a reader on the structured (array or
// object) value if not already acquired.
//
JsonReader valueReader = _memberStructuredValueReader;
if (valueReader == null)
valueReader = _memberStructuredValueReader = value.CreateReader();
//
// Serve tokens from the value reader until OEF.
//
if (valueReader.Read())
return valueReader.Token;
//
// Proceed with next.
//
_memberValue = JsonBuffer.Empty;
_memberStructuredValueReader = null;
_index++;
return ReadTokenImpl();
}
else // JSON Null, Boolean, Number or String
{
Debug.Assert(value.IsNull || value.IsScalar);
//
// Establish state to proceed with next and
// serve token pertaining to scalar value.
//
_memberValue = JsonBuffer.Empty;
_index++;
return value.IsNull
? JsonToken.Null()
: value.CreateReader().Token;
}
}
//
// Serve buffered member name and establish state so
// that the value will be served next.
//
NamedJsonBuffer member = (NamedJsonBuffer) bufferedMembers[index];
_memberValue = member.Buffer;
return JsonToken.Member(member.Name);
}
//
// Done with buffered members so now move on to remaining
// members from the underlying reader.
//
if (baseReader == null)
return JsonToken.EOF(); // Done with serving
//
// If base reader is on the object end at the same depth as
// on entry then serve the last end token. The reader is
// released so that on next read, the above will signal EOF.
//
if (baseReader.Depth == _innerDepth
&& baseReader.TokenClass == JsonTokenClass.EndObject)
{
_reader = null;
}
//
// Move through the base reader.
//
JsonToken token = baseReader.Token;
baseReader.Read();
return token;
}