private static void WriteJson(DynamoDBEntry entry, JsonWriter writer, DynamoDBEntryConversion conversion)
{
entry = entry.ToConvertedEntry(conversion);
var document = entry as Document;
if (document != null)
{
writer.WriteObjectStart();
// Both item attributes and entries in M type are unordered, so sorting by key
// http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes
foreach (var kvp in document)
{
var name = kvp.Key;
var value = kvp.Value;
writer.WritePropertyName(name);
WriteJson(value, writer, conversion);
}
writer.WriteObjectEnd();
return;
}
var primitive = entry as Primitive;
if (primitive != null)
{
var type = primitive.Type;
var value = primitive.Value;
WritePrimitive(writer, type, value);
return;
}
var primitiveList = entry as PrimitiveList;
if (primitiveList != null)
{
var itemType = primitiveList.Type;
writer.WriteArrayStart();
foreach (var item in primitiveList.Entries)
{
var itemValue = item.Value;
WritePrimitive(writer, itemType, itemValue);
}
writer.WriteArrayEnd();
return;
}
var ddbList = entry as DynamoDBList;
if (ddbList != null)
{
writer.WriteArrayStart();
foreach(var item in ddbList.Entries)
{
WriteJson(item, writer, conversion);
}
writer.WriteArrayEnd();
return;
}
var ddbBool = entry as DynamoDBBool;
if (ddbBool != null)
{
writer.Write(ddbBool.Value);
return;
}
var ddbNull = entry as DynamoDBNull;
if (ddbNull != null)
{
writer.Write(null);
return;
}
throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture,
"Unable to convert entry of type {0} to JSON", entry.GetType().FullName));
}