using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
[JsonProperty("quantity")]
public int Quantity { get; set; }
public string Type { get; set; }
public Price Price { get; set; }
[JsonProperty("budgetcost")]
public int Budgetcost { get; set; }
public string Icon { get; set; }
public int Id { get; set; }
[JsonProperty("itemlevel")]
public int Itemlevel { get; set; }
public string Name { get; set; }
[JsonProperty("override")]
public Override Override { get; set; }
[JsonProperty("sellable")]
public string Sellable { get; set; }
[JsonProperty("stackable")]
public string Stackable { get; set; }
[JsonProperty("stacksize")]
public int Stacksize { get; set; }
public IDictionary<string, List<TicketDatum>> Ticket { get; set; }
public Data Data { get; set; }
public static void Main()
var json = "{\"data\":{\"ticket\":{\"budgetcost\":1,\"id\":151002,\"icon\":\"icon2\",\"itemlevel\":0,\"name\":\"ticket\",\"sellable\":\"true\",\"override\":{\"price\":{\"quantity\":1,\"type\":\"gold\"}},\"stackable\":\"true\",\"stacksize\":5000},\"ticket2\":{\"budgetcost\":1,\"id\":151003,\"icon\":\"icon2\",\"itemlevel\":0,\"name\":\"ticket2\",\"sellable\":\"true\",\"override\":{\"price\":{\"quantity\":1,\"type\":\"gold\"}},\"stackable\":\"true\",\"stacksize\":11111}}}";
var settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new DictionaryAsArrayResolver();
var foo = JsonConvert.DeserializeObject<DummyClass>(json, settings);
Console.WriteLine("Foo: {" + foo.Data.Ticket.Count() + " }");
foreach(var item in foo.Data.Ticket)
Console.WriteLine(item.Key);
internal class DictionaryAsArrayResolver : DefaultContractResolver
protected override JsonContract CreateContract(Type objectType)
Console.WriteLine(objectType);
if (objectType.GetInterfaces().Any(i => i == typeof(IDictionary) ||
i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDictionary<,>)))
return CreateDictionaryContract(objectType);
return base.CreateContract(objectType);
internal class ListAsArrayResolver : DefaultContractResolver
protected override JsonContract CreateContract(Type objectType)
if (objectType.GetInterfaces().Any(i => i == typeof(IList) ||
i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>)))
return CreateObjectContract(objectType);
return base.CreateContract(objectType);