102 lines
3.8 KiB
C#
102 lines
3.8 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.ToLower() == nameof(Triplet.key).ToLower())
|
|
{
|
|
Debug.Assert(reader.TokenType == JsonTokenType.String);
|
|
ret.key = reader.GetString();
|
|
}
|
|
else if (jsonkey.ToLower() == nameof(Triplet.predicate).ToLower())
|
|
{
|
|
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.ToLower() == nameof(Triplet.value).ToLower())
|
|
{
|
|
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} at {reader.TokenStartIndex} for {reader.GetString()}.");
|
|
}
|
|
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();
|
|
}
|
|
}
|