in lang/csharp/src/apache/main/IO/JsonDecoder.cs [616:707]
public override Symbol DoAction(Symbol input, Symbol top)
{
if (top is Symbol.FieldAdjustAction)
{
Symbol.FieldAdjustAction fa = (Symbol.FieldAdjustAction)top;
string name = fa.FName;
if (currentReorderBuffer != null)
{
IList<JsonElement> node = currentReorderBuffer.SavedFields[name];
if (node != null)
{
currentReorderBuffer.SavedFields.Remove(name);
currentReorderBuffer.OrigParser = reader;
reader = MakeParser(node);
return null;
}
}
if (reader.TokenType == JsonToken.PropertyName)
{
do
{
string fn = Convert.ToString(reader.Value);
reader.Read();
if (name.Equals(fn) || (fa.Aliases != null && fa.Aliases.Contains(fn)))
{
return null;
}
else
{
if (currentReorderBuffer == null)
{
currentReorderBuffer = new ReorderBuffer();
}
currentReorderBuffer.SavedFields[fn] = GetValueAsTree(reader);
}
} while (reader.TokenType == JsonToken.PropertyName);
throw new AvroTypeException("Expected field name not found: " + fa.FName);
}
}
else if (top == Symbol.FieldEnd)
{
if (currentReorderBuffer != null && currentReorderBuffer.OrigParser != null)
{
reader = currentReorderBuffer.OrigParser;
currentReorderBuffer.OrigParser = null;
}
}
else if (top == Symbol.RecordStart)
{
if (reader.TokenType == JsonToken.StartObject)
{
reader.Read();
reorderBuffers.Push(currentReorderBuffer);
currentReorderBuffer = null;
}
else
{
throw TypeError("record-start");
}
}
else if (top == Symbol.RecordEnd || top == Symbol.UnionEnd)
{
// AVRO-2034 advance to the end of our object
while (reader.TokenType != JsonToken.EndObject)
{
reader.Read();
}
if (top == Symbol.RecordEnd)
{
if (currentReorderBuffer != null && currentReorderBuffer.SavedFields.Count > 0)
{
throw TypeError("Unknown fields: " + currentReorderBuffer.SavedFields.Keys
.Aggregate((x, y) => x + ", " + y));
}
currentReorderBuffer = reorderBuffers.Pop();
}
// AVRO-2034 advance beyond the end object for the next record.
reader.Read();
}
else
{
throw new AvroTypeException("Unknown action symbol " + top);
}
return null;
}