Skip to content

Instantly share code, notes, and snippets.

@AndyButland
Created May 30, 2023 15:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndyButland/c4e47c78e403d4b8805bc7afc299e279 to your computer and use it in GitHub Desktop.
Save AndyButland/c4e47c78e403d4b8805bc7afc299e279 to your computer and use it in GitHub Desktop.
internal class MyApiPostedValuesConverter : JsonConverter<IDictionary<string, IList<string>>>
{
public override bool CanConvert(Type typeToConvert) => true;
public override IDictionary<string, IList<string>> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException(GetJsonExceptionMessage("Start object token not found"));
}
var result = new Dictionary<string, IList<string>>();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
{
return result;
}
if (reader.TokenType != JsonTokenType.PropertyName)
{
throw new JsonException(GetJsonExceptionMessage("Field alias token not found"));
}
string fieldAlias = GetFieldAlias(ref reader);
reader.Read();
result[fieldAlias] = GetFieldValues(ref reader);
}
throw new JsonException(GetJsonExceptionMessage("End object token not found"));
static string GetJsonExceptionMessage(string message) => $"Could not read input in {nameof(UmbracoFormsApiPostedValuesConverter)}. {message}.";
static string GetFieldAlias(ref Utf8JsonReader reader)
{
string? fieldAlias = reader.GetString();
if (string.IsNullOrEmpty(fieldAlias))
{
throw new JsonException(GetJsonExceptionMessage("Field alias value is empty"));
}
return fieldAlias;
}
static List<string> GetFieldValues(ref Utf8JsonReader reader)
{
var fieldValues = new List<string>();
if (reader.TokenType == JsonTokenType.String)
{
string fieldValue = reader.GetString() ?? string.Empty;
fieldValues.Add(fieldValue);
}
else if (reader.TokenType == JsonTokenType.StartArray)
{
fieldValues = new List<string>();
while (reader.TokenType != JsonTokenType.EndArray)
{
if (reader.TokenType == JsonTokenType.String)
{
string fieldValue = reader.GetString() ?? string.Empty;
fieldValues.Add(fieldValue);
}
reader.Read();
}
}
return fieldValues;
}
}
public override void Write(Utf8JsonWriter writer, IDictionary<string, IList<string>> value, JsonSerializerOptions options) => throw new NotImplementedException();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment