protected internal JsonConverter() { }
public override bool CanConvert(System.Type typeToConvert) { throw null; }
public abstract T Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options);
- public virtual void Write(System.Text.Json.Utf8JsonWriter writer, T value, System.Text.Json.JsonEncodedText propertyName, System.Text.Json.JsonSerializerOptions options) { }
public abstract void Write(System.Text.Json.Utf8JsonWriter writer, T value, System.Text.Json.JsonSerializerOptions options);
}
[System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false)]
{
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.True && reader.TokenType != JsonTokenType.False)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetBoolean();
}
{
writer.WriteBooleanValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, bool value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteBoolean(propertyName, value);
- }
}
}
{
public override byte Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetByte();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, byte value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.String)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetBytesFromBase64();
}
{
writer.WriteBase64StringValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, byte[] value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteBase64String(propertyName, value);
- }
}
}
{
public override char Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.String)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetString()[0];
}
#endif
);
}
-
- public override void Write(Utf8JsonWriter writer, char value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteString(propertyName,
-#if BUILDING_INBOX_LIBRARY
- MemoryMarshal.CreateSpan(ref value, 1)
-#else
- value.ToString()
-#endif
- );
- }
}
}
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.String)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetDateTime();
}
{
writer.WriteStringValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, DateTime value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteString(propertyName, value);
- }
}
}
{
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.String)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetDateTimeOffset();
}
{
writer.WriteStringValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteString(propertyName, value);
- }
}
}
{
public override decimal Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetDecimal();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, decimal value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
public override double Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetDouble();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, double value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
break;
}
}
-
- public override void Write(Utf8JsonWriter writer, T value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- // If strings are allowed, attempt to write it out as a string value
- if (_converterOptions.HasFlag(EnumConverterOptions.AllowStrings))
- {
- string original = value.ToString();
- if (_nameCache != null && _nameCache.TryGetValue(original, out string transformed))
- {
- writer.WriteString(propertyName, transformed);
- return;
- }
-
- if (IsValidIdentifier(original))
- {
- transformed = _namingPolicy.ConvertName(original);
- writer.WriteString(propertyName, transformed);
- if (_nameCache != null)
- {
- _nameCache.TryAdd(original, transformed);
- }
- return;
- }
- }
-
- if (!_converterOptions.HasFlag(EnumConverterOptions.AllowNumbers))
- {
- ThrowHelper.ThrowJsonException();
- }
-
- switch (s_enumTypeCode)
- {
- case TypeCode.Int32:
- writer.WriteNumber(propertyName, Unsafe.As<T, int>(ref value));
- break;
- case TypeCode.UInt32:
- writer.WriteNumber(propertyName, Unsafe.As<T, uint>(ref value));
- break;
- case TypeCode.UInt64:
- writer.WriteNumber(propertyName, Unsafe.As<T, ulong>(ref value));
- break;
- case TypeCode.Int64:
- writer.WriteNumber(propertyName, Unsafe.As<T, long>(ref value));
- break;
- case TypeCode.Int16:
- writer.WriteNumber(propertyName, Unsafe.As<T, short>(ref value));
- break;
- case TypeCode.UInt16:
- writer.WriteNumber(propertyName, Unsafe.As<T, ushort>(ref value));
- break;
- case TypeCode.Byte:
- writer.WriteNumber(propertyName, Unsafe.As<T, byte>(ref value));
- break;
- case TypeCode.SByte:
- writer.WriteNumber(propertyName, Unsafe.As<T, sbyte>(ref value));
- break;
- default:
- ThrowHelper.ThrowJsonException();
- break;
- }
- }
}
}
{
public override Guid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.String)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetGuid();
}
{
writer.WriteStringValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, Guid value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteString(propertyName, value);
- }
}
}
{
public override short Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetInt16();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, short value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetInt32();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, int value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetInt64();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, long value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
value.WriteValue(writer);
}
-
- public override void Write(Utf8JsonWriter writer, JsonElement value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- value.WriteProperty(propertyName.ToString(), writer);
- }
}
}
T k;
Type typeToConvert = typeof(T);
+ // Attempt to use existing converter first before re-entering through JsonSerializer.Read().
JsonConverter<T> keyConverter = options.GetConverter(typeToConvert) as JsonConverter<T>;
if (keyConverter == null)
{
private void WriteProperty<T>(Utf8JsonWriter writer, T value, JsonEncodedText name, JsonSerializerOptions options)
{
+ writer.WritePropertyName(name);
+
+ // Attempt to use existing converter first before re-entering through JsonSerializer.Write().
JsonConverter<T> keyConverter = options.GetConverter(typeof(T)) as JsonConverter<T>;
if (keyConverter == null)
{
- // todo: set property name on writer once that functionality exists
- // JsonSerializer.WriteValue<T>(writer, value, options);
- throw new NotImplementedException();
+ JsonSerializer.Serialize<T>(writer, value, options);
}
else
{
- keyConverter.Write(writer, value, name, options);
+ keyConverter.Write(writer, value, options);
}
}
WriteProperty(writer, value.Value, _valueName, options);
writer.WriteEndObject();
}
-
- public override void Write(Utf8JsonWriter writer, KeyValuePair<TKey, TValue> value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteStartObject(propertyName);
- WriteProperty(writer, value.Key, _keyName, options);
- WriteProperty(writer, value.Value, _valueName, options);
- writer.WriteEndObject();
- }
}
}
{
throw new InvalidOperationException();
}
-
- public override void Write(Utf8JsonWriter writer, object value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- throw new InvalidOperationException();
- }
}
}
{
public override sbyte Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetSByte();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, sbyte value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
public override float Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetSingle();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, float value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.String)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetString();
}
{
writer.WriteStringValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, string value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteString(propertyName, value);
- }
}
}
{
public override ushort Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetUInt16();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, ushort value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
public override uint Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetUInt32();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, uint value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
{
public override ulong Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- if (reader.TokenType != JsonTokenType.Number)
- {
- ThrowHelper.ThrowJsonException();
- }
-
return reader.GetUInt64();
}
{
writer.WriteNumberValue(value);
}
-
- public override void Write(Utf8JsonWriter writer, ulong value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteNumber(propertyName, value);
- }
}
}
// TODO: remove preprocessing when https://github.com/dotnet/corefx/issues/38647 is implemented.
writer.WriteStringValue(value.ToString());
}
-
- public override void Write(Utf8JsonWriter writer, Uri value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- // TODO: remove preprocessing when https://github.com/dotnet/corefx/issues/38647 is implemented.
- writer.WriteString(propertyName, value.ToString());
- }
}
}
/// <param name="options">The <see cref="JsonSerializerOptions"/> being used.</param>
public abstract void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options);
- /// <summary>
- /// todo: remove this method once the writer supports setting a property name
- /// </summary>
- /// <param name="writer"></param>
- /// <param name="value"></param>
- /// <param name="propertyName"></param>
- /// <param name="options"></param>
- public virtual void Write(Utf8JsonWriter writer, T value, JsonEncodedText propertyName, JsonSerializerOptions options) { throw new NotImplementedException(); }
-
internal override Type TypeToConvert => typeof(T);
}
}
{
if (EscapedName.HasValue)
{
- Converter.Write(writer, value, EscapedName.Value, Options);
- }
- else
- {
- Converter.Write(writer, value, Options);
+ writer.WritePropertyName(EscapedName.Value);
}
+
+ Converter.Write(writer, value, Options);
}
}
{
if (EscapedName.HasValue)
{
- Converter.Write(writer, value, EscapedName.Value, Options);
- }
- else
- {
- Converter.Write(writer, value, Options);
+ writer.WritePropertyName(EscapedName.Value);
}
+
+ Converter.Write(writer, value, Options);
}
}
{
if (EscapedName.HasValue)
{
- Converter.Write(writer, value.GetValueOrDefault(), EscapedName.Value, Options);
- }
- else
- {
- Converter.Write(writer, value.GetValueOrDefault(), Options);
+ writer.WritePropertyName(EscapedName.Value);
}
+
+ Converter.Write(writer, value.GetValueOrDefault(), Options);
}
}
else
{
JsonEncodedText escapedKey = JsonEncodedText.Encode(key);
- converter.Write(writer, value, escapedKey, options);
+ writer.WritePropertyName(escapedKey);
+ converter.Write(writer, value, options);
}
}
}
writer.WriteStringValue(builder.ToString());
}
-
- public override void Write(Utf8JsonWriter writer, long[] value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- var builder = new StringBuilder();
-
- for (int i = 0; i < value.Length; i++)
- {
- builder.Append(value[i].ToString());
-
- if (i != value.Length - 1)
- {
- builder.Append(",");
- }
- }
-
- writer.WriteString(propertyName, builder.ToString());
- }
}
[Fact]
string stringValue = $"{value.X - _offset},{value.Y - _offset}";
writer.WriteStringValue(stringValue);
}
-
- public override void Write(Utf8JsonWriter writer, AttributedPoint value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- string stringValue = $"{value.X - _offset},{value.Y - _offset}";
- writer.WriteString(propertyName, stringValue);
- }
}
[Fact]
{
throw new SuccessException();
}
-
- public override void Write(Utf8JsonWriter writer, Customer value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- throw new SuccessException();
- }
}
[Fact]
{
writer.WriteStartObject();
}
-
- public override void Write(Utf8JsonWriter writer, Level3 value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteStartObject(propertyName);
- }
}
[Fact]
{
throw new TException();
}
-
- public override void Write(Utf8JsonWriter writer, int value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- throw new TException();
- }
}
public static void ConverterFailNoRethrow<TException>() where TException : Exception, new()
// Write the name of the type.
writer.WriteStringValue(value.GetType().ToString());
}
-
- public override void Write(Utf8JsonWriter writer, object value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteString(propertyName, value.GetType().ToString());
- }
}
[Fact]
{
throw new InvalidOperationException("Directly writing object not supported");
}
-
- public override void Write(Utf8JsonWriter writer, object value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- throw new InvalidOperationException("Directly writing object not supported");
- }
}
[Fact]
string stringValue = $"{value.X - _coordinateOffset},{value.Y - _coordinateOffset}";
writer.WriteStringValue(stringValue);
}
-
- public override void Write(Utf8JsonWriter writer, Point value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- string stringValue = $"{value.X - _coordinateOffset},{value.Y - _coordinateOffset}";
- writer.WriteString(propertyName, stringValue);
- }
}
[Fact]
writer.WriteEndObject();
}
-
- // todo: remove this method once writer supports setting property name.
- public override void Write(Utf8JsonWriter writer, Point value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteStartObject(propertyName);
-
- string stringValue = $"{value.X},{value.Y}";
- writer.WriteString("COORD", stringValue);
-
- writer.WriteEndObject();
- }
}
[Fact]
writer.WriteEndObject();
}
-
- // todo: remove this method once writer supports setting property name.
- public override void Write(Utf8JsonWriter writer, ClassWithStringProperties value, JsonEncodedText propertyName, JsonSerializerOptions options)
- {
- writer.WriteStartObject(propertyName);
-
- writer.WriteString("MyString0", value.MyString0);
- writer.WriteString("MyString1", value.MyString1);
- writer.WriteString("MyString2", value.MyString2);
- writer.WriteString("MyString3", value.MyString3);
- writer.WriteString("MyString4", value.MyString4);
- writer.WriteString("MyString5", value.MyString5);
- writer.WriteString("MyString6", value.MyString6);
- writer.WriteString("MyString7", value.MyString7);
- writer.WriteString("MyString8", value.MyString8);
- writer.WriteString("MyString9", value.MyString9);
-
- writer.WriteEndObject();
- }
}
}
}
Assert.Equal(@"[{""Key"":""123"",""Value"":123},{""Key"":""456"",""Value"":456}]", json);
}
- [Fact(Skip = "Disabled until writer enables property name to be set")]
+ [Fact]
public static void WriteKeyValuePairOfList()
{
KeyValuePair<string, List<int>> input = new KeyValuePair<string, List<int>>("Key", new List<int> { 1, 2, 3 });