The easiest and most flexible way to handle custom json format would be to implement custom JSON.Net converter. Below is example implementation that works for your json message.
First is Cart type
public class Cart
{
public long? cartId { get; set; }
public string id { get; set; }
public string quantity { get; set; }
public CartModifier modifier { get; set; }
}
[JsonConverter(typeof(CartModifierSerializer))]
public class CartModifier
{
public CartModifier()
{
Values = new Dictionary<string, long>();
}
public Dictionary<string, long> Values { get; set; }
}
and next is custom json converter for CartModifier class
public class CartModifierSerializer : JsonConverter {
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var modifier = value as CartModifier;
writer.WriteStartObject();
foreach (var pair in modifier.Values)
{
writer.WritePropertyName(pair.Key);
writer.WriteValue(pair.Value);
}
writer.WriteEndObject();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jsonObject = JObject.Load(reader);
var properties = jsonObject.Properties().ToList();
return new CartModifier
{
Values = properties.ToDictionary(x => x.Name, x => (long) x.Value)
};
}
public override bool CanConvert(Type objectType)
{
return typeof(CartModifier).IsAssignableFrom(objectType);
}
}
and below are example serialization/deserialization usages:
[Test]
public void TestSerialization()
{
var cart = new Cart()
{
id = "944990015513953203",
quantity = "3",
modifier = new CartModifier()
{
Values =
{
{"1033306667720114200", 1033308953984892900}
}
}
};
Console.WriteLine(JsonConvert.SerializeObject(cart));
}
[Test]
public void TestDeseriazliation()
{
var data = "{\"cartId\":null, \"id\":\"944990015513953203\",\"quantity\":\"3\",\"modifier\":{ \"1033306667720114200\":1033308953984892900 }}";
var cart = JsonConvert.DeserializeObject<Cart>(data);
Assert.AreEqual(cart.modifier.Values["1033306667720114200"], 1033308953984892900);
}