Salmon/Salmon.Web/TripletJsonConverter.cs
2024-05-19 19:23:32 +02:00

101 lines
3.6 KiB
C#

using Salmon.Core;
using System.Diagnostics;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Salmon.Web;
public class TripletJsonConverter
: JsonConverter<Triplet>
{
public override Triplet? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
Debug.Assert(reader.TokenType == JsonTokenType.StartObject);
Triplet ret = new ();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
break;
Debug.Assert(reader.TokenType == JsonTokenType.PropertyName);
string jsonkey = reader.GetString();
Debug.Assert(reader.Read());
if(jsonkey == nameof(Triplet.key))
{
Debug.Assert(reader.TokenType == JsonTokenType.String);
ret.key = reader.GetString();
}
else if (jsonkey == nameof(Triplet.predicate))
{
Debug.Assert(reader.TokenType == JsonTokenType.String);
ret.predicate = reader.GetString();
}
else if(jsonkey.ToLower() == nameof(Triplet.LastFlush).ToLower())
{
Debug.Assert(reader.TokenType == JsonTokenType.String);
ret.LastFlush = reader.GetDateTime();
}
else if (jsonkey == nameof(Triplet.value))
{
if (reader.TokenType == JsonTokenType.Null)
ret.value = null;
else if (reader.TokenType == JsonTokenType.False)
ret.value = false;
else if (reader.TokenType == JsonTokenType.True)
ret.value = true;
else if (reader.TokenType == JsonTokenType.String)
ret.value = reader.GetString();
else if (reader.TokenType == JsonTokenType.Number)
ret.value = reader.GetDouble();
else
throw new NotImplementedException($"Cannot read Triple.value from token type {reader.TokenType}.");
}
else
Console.WriteLine($"Unknown triplet field {jsonkey} with token type {reader.TokenType}.");
}
return ret;
}
public override void Write(Utf8JsonWriter writer, Triplet value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteString(nameof(Triplet.key), value.key);
writer.WriteString(nameof(Triplet.predicate), value.predicate);
writer.WritePropertyName(nameof(Triplet.LastFlush));
writer.WriteStringValue(value.LastFlush);
writer.WritePropertyName(nameof(Triplet.value));
object? tval = value.value;
if (tval is null)
writer.WriteNullValue();
else if (tval is bool)
writer.WriteBooleanValue((bool)tval);
else if (tval is string)
writer.WriteStringValue((string)tval);
else if (tval is int)
writer.WriteNumberValue((int)tval);
else if (tval is long)
writer.WriteNumberValue((long)tval);
else if (tval is uint)
writer.WriteNumberValue((uint)tval);
else if (tval is ulong)
writer.WriteNumberValue((ulong)tval);
else if (tval is float)
writer.WriteNumberValue((float)tval);
else if (tval is double)
writer.WriteNumberValue((double)tval);
else if (tval is DateTime)
writer.WriteStringValue((DateTime)tval);
else
throw new NotImplementedException($"Cannot serialize type {tval.GetType()}.");
writer.WriteEndObject();
}
}