Browse Source

Better json types

pull/335/head
Sebastian Stehle 8 years ago
parent
commit
038935d0a8
  1. 2
      src/Squidex.Infrastructure/EventSourcing/EnvelopeExtensions.cs
  2. 10
      src/Squidex.Infrastructure/Json/Newtonsoft/JsonValueConverter.cs
  3. 30
      src/Squidex.Infrastructure/Json/Objects/JsonBoolean.cs
  4. 27
      src/Squidex.Infrastructure/Json/Objects/JsonNumber.cs
  5. 33
      src/Squidex.Infrastructure/Json/Objects/JsonScalar.cs
  6. 27
      src/Squidex.Infrastructure/Json/Objects/JsonString.cs
  7. 12
      src/Squidex.Infrastructure/Json/Objects/JsonValue.cs

2
src/Squidex.Infrastructure/EventSourcing/EnvelopeExtensions.cs

@ -91,7 +91,7 @@ namespace Squidex.Infrastructure.EventSourcing
{
if (obj.TryGetValue(key, out var v))
{
if (v is JsonScalar<double> number)
if (v is JsonNumber number)
{
return (long)number.Value;
}

10
src/Squidex.Infrastructure/Json/Newtonsoft/JsonValueConverter.cs

@ -115,13 +115,13 @@ namespace Squidex.Infrastructure.Json.Newtonsoft
case JsonNull n:
writer.WriteNull();
break;
case JsonScalar<bool> s:
case JsonBoolean s:
writer.WriteValue(s.Value);
break;
case JsonScalar<string> s:
case JsonString s:
writer.WriteValue(s.Value);
break;
case JsonScalar<double> s:
case JsonNumber s:
if (s.Value % 1 == 0)
{
@ -136,9 +136,9 @@ namespace Squidex.Infrastructure.Json.Newtonsoft
case JsonArray array:
writer.WriteStartArray();
foreach (var item in array)
for (var i = 0; i < array.Count; i++)
{
WriteJson(writer, item);
WriteJson(writer, array[i]);
}
writer.WriteEndArray();

30
src/Squidex.Infrastructure/Json/Objects/JsonBoolean.cs

@ -0,0 +1,30 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
namespace Squidex.Infrastructure.Json.Objects
{
public sealed class JsonBoolean : JsonScalar<bool>
{
public static readonly JsonBoolean True = new JsonBoolean(true);
public static readonly JsonBoolean False = new JsonBoolean(false);
public override JsonValueType Type
{
get { return JsonValueType.Boolean; }
}
private JsonBoolean(bool value)
: base(value)
{
}
public override string ToString()
{
return Value ? "true" : "false";
}
}
}

27
src/Squidex.Infrastructure/Json/Objects/JsonNumber.cs

@ -0,0 +1,27 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
namespace Squidex.Infrastructure.Json.Objects
{
public sealed class JsonNumber : JsonScalar<double>
{
public override JsonValueType Type
{
get { return JsonValueType.Number; }
}
internal JsonNumber(double value)
: base(value)
{
}
public override string ToJsonString()
{
return $"{Value}";
}
}
}

33
src/Squidex.Infrastructure/Json/Objects/JsonScalar.cs

@ -9,22 +9,15 @@ using System;
namespace Squidex.Infrastructure.Json.Objects
{
public sealed class JsonScalar<T> : IJsonValue, IEquatable<JsonScalar<T>>
public abstract class JsonScalar<T> : IJsonValue, IEquatable<JsonScalar<T>>
{
private readonly T value;
public abstract JsonValueType Type { get; }
public JsonValueType Type { get; }
public T Value { get; }
public T Value
protected JsonScalar(T value)
{
get { return value; }
}
internal JsonScalar(JsonValueType type, T value)
{
Type = type;
this.value = value;
Value = value;
}
public override bool Equals(object obj)
@ -39,31 +32,21 @@ namespace Squidex.Infrastructure.Json.Objects
public bool Equals(JsonScalar<T> other)
{
return other != null && other.Type == Type && Equals(other.value, value);
return other != null && other.Type == Type && Equals(other.Value, Value);
}
public override int GetHashCode()
{
return value.GetHashCode();
return Value.GetHashCode();
}
public override string ToString()
{
if (Type == JsonValueType.Boolean)
{
return Equals(Value, true) ? "true" : "false";
}
return Value.ToString();
}
public string ToJsonString()
public virtual string ToJsonString()
{
if (Type == JsonValueType.String)
{
return $"\"{value}\"";
}
return ToString();
}
}

27
src/Squidex.Infrastructure/Json/Objects/JsonString.cs

@ -0,0 +1,27 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
namespace Squidex.Infrastructure.Json.Objects
{
public sealed class JsonString : JsonScalar<string>
{
public override JsonValueType Type
{
get { return JsonValueType.String; }
}
internal JsonString(string value)
: base(value)
{
}
public override string ToJsonString()
{
return $"\"{Value}\"";
}
}
}

12
src/Squidex.Infrastructure/Json/Objects/JsonValue.cs

@ -14,14 +14,14 @@ namespace Squidex.Infrastructure.Json.Objects
{
public static class JsonValue
{
public static readonly IJsonValue Empty = new JsonScalar<string>(JsonValueType.String, string.Empty);
public static readonly IJsonValue Empty = new JsonString(string.Empty);
public static readonly IJsonValue True = new JsonScalar<bool>(JsonValueType.Boolean, true);
public static readonly IJsonValue False = new JsonScalar<bool>(JsonValueType.Boolean, false);
public static readonly IJsonValue True = JsonBoolean.True;
public static readonly IJsonValue False = JsonBoolean.False;
public static readonly IJsonValue Null = JsonNull.Null;
public static readonly IJsonValue Zero = new JsonScalar<double>(JsonValueType.Number, 0);
public static readonly IJsonValue Zero = new JsonNumber(0);
public static JsonArray Array()
{
@ -85,7 +85,7 @@ namespace Squidex.Infrastructure.Json.Objects
return Zero;
}
return new JsonScalar<double>(JsonValueType.Number, value);
return new JsonNumber(value);
}
public static IJsonValue Create(Instant? value)
@ -130,7 +130,7 @@ namespace Squidex.Infrastructure.Json.Objects
return Empty;
}
return new JsonScalar<string>(JsonValueType.String, value);
return new JsonString(value);
}
}
}

Loading…
Cancel
Save