1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
using Newtonsoft.Json;
public class LSPAnyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(LSPAny);
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
reader = reader ?? throw new ArgumentNullException(nameof(reader));
switch (reader.TokenType)
{
case JsonToken.Null:
return null;
case JsonToken.Integer:
return new LSPAny(serializer.Deserialize<long>(reader));
case JsonToken.Float:
return new LSPAny(serializer.Deserialize<float>(reader));
case JsonToken.Boolean:
return new LSPAny(serializer.Deserialize<bool>(reader));
case JsonToken.String:
return new LSPAny(serializer.Deserialize<string>(reader));
case JsonToken.StartArray:
List<object>? l = serializer.Deserialize<List<object>>(reader);
if (l == null)
{
return null;
}
return new LSPAny(new LSPArray(l));
case JsonToken.StartObject:
Dictionary<string, object?>? o = serializer.Deserialize<Dictionary<string, object?>>(reader);
if (o == null)
{
return null;
}
return new LSPAny(new LSPObject(o));
}
throw new JsonSerializationException($"Unexpected token type '{reader.TokenType}' while deserializing '{objectType.Name}'.");
}
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
if (value is null)
{
writer.WriteNull();
}
else
{
serializer.Serialize(writer, ((LSPAny)value).Value);
}
}
}
|