using System.ComponentModel;
using System.Collections.Generic;
using System.Globalization;
public static void Main()
var testString = "Number=6&Id=a355921d-a429-4952-b744-210b98a7fbe6&Values=a,b";
var deserialized2 = FormUrlEncodedDeserializerV2.Deserialize<DataV2>(testString);
Console.WriteLine("number: " + deserialized2.Number);
Console.WriteLine("id: " + deserialized2.Id);
Console.WriteLine("values: " + string.Join(", ", deserialized2.Values));
[JsonConverter(typeof(ListToCsvConverter))]
public List<string> Values {get;}
public DataV2(int number, Guid id, List<string> values) {
public static class FormUrlEncodedDeserializerV2 {
public static T Deserialize<T>(string formUrlEncoded)
var keyValues = HttpUtility.ParseQueryString(formUrlEncoded);
var dictionary = keyValues.AllKeys.ToDictionary(k => k, k => keyValues[k]);
var json = JsonConvert.SerializeObject(dictionary);
return JsonConvert.DeserializeObject<T>(json);
public class ListToCsvConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(List<string>);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
writer.WriteValue(string.Join(",", (List<string>)value));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
return new List<string>(((string)reader.Value).Split(','));