Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Use <code>CustomCreationConverter&lt;T&gt;</code> as JsonConverter and override both <code>Create</code> and <code>ReadJson</code> method.</p> <pre><code>class ItemConverter : CustomCreationConverter&lt;Item&gt; { public override Item Create(Type objectType) { return new Item(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jObject = JObject.Load(reader); int categoryId = jObject["categoryId"].ToObject&lt;int&gt;(); Category category = Program.Repository.GetCategoryById(categoryId); Item result = (Item)base.ReadJson(jObject.CreateReader(), objectType, existingValue, serializer); result.Category = category; return result; } } class Item { [JsonProperty("itemName")] public string ItemName { get; set; } public Category Category { get; set; } // other properties. } class Category { public int CategoryId { get; set; } public string Name { get; set; } // other properties. } class MockCategoryRepository { IList&lt;Category&gt; _repository; public MockCategoryRepository() { _repository = new List&lt;Category&gt;(); _repository.Add(new Category() { CategoryId = 1, Name = "Drink" }); _repository.Add(new Category() { CategoryId = 35, Name = "Food" }); _repository.Add(new Category() { CategoryId = 70, Name = "Fruit" }); } public Category GetCategoryById(int id) { return _repository.Where(x =&gt; x.CategoryId == id).SingleOrDefault(); } } class Program { public static MockCategoryRepository Repository { get; private set; } static void Main(string[] args) { Repository = new MockCategoryRepository(); // initialize mock repository // sample : json contains two items in an array. string jsonString = @" [ { ""categoryId"":""35"", ""itemName"":""Item A"" }, { ""categoryId"":""70"", ""itemName"":""Item B"" }, ]"; List&lt;Item&gt; items = JsonConvert.DeserializeObject&lt;List&lt;Item&gt;&gt;(jsonString, new ItemConverter()); } } </code></pre> <h2>Updated answer :</h2> <p>Solution for condition where <code>Category</code> object information is fetched from the same json string.</p> <pre><code>class ItemConverter : CustomCreationConverter&lt;Item&gt; { readonly IEnumerable&lt;Category&gt; _repository; public ItemConverter(IEnumerable&lt;Category&gt; categories) { _repository = categories; } public override Item Create(Type objectType) { return new Item(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jObject = JObject.Load(reader); int categoryId = jObject["categoryId"].ToObject&lt;int&gt;(); Category category = _repository.Where(x =&gt; x.CategoryId == categoryId).SingleOrDefault(); Item result = (Item)base.ReadJson(jObject.CreateReader(), objectType, existingValue, serializer); result.Category = category; return result; } } class Item { [JsonProperty("name")] public string Name { get; set; } public Category Category { get; set; } // other properties. } class Category { [JsonProperty("id")] public int CategoryId { get; set; } [JsonProperty("name")] public string Name { get; set; } // other properties. } class Program { static void Main(string[] args) { // sample : json contains items and/or categories in an array. string jsonString = @" [ { ""id"" : ""2"", ""categoryId"" : ""35"", ""type"" : ""item"", ""name"" : ""hamburger"" }, { ""id"" : ""35"", ""type"" : ""category"", ""name"" : ""drinks"" } ]"; JArray jsonArray = JArray.Parse(jsonString); // Separate between category and item data. IEnumerable&lt;JToken&gt; jsonCategories = jsonArray.Where(x =&gt; x["type"].ToObject&lt;string&gt;() == "category"); IEnumerable&lt;JToken&gt; jsonItems = jsonArray.Where(x =&gt; x["type"].ToObject&lt;string&gt;() == "item"); // Create list of category from jsonCategories. IEnumerable&lt;Category&gt; categories = jsonCategories.Select(x =&gt; x.ToObject&lt;Category&gt;()); // Settings for jsonItems deserialization. JsonSerializerSettings itemDeserializerSettings = new JsonSerializerSettings(); itemDeserializerSettings.Converters.Add(new ItemConverter(categories)); JsonSerializer itemDeserializer = JsonSerializer.Create(itemDeserializerSettings); // Create list of item from jsonItems. IEnumerable&lt;Item&gt; items = jsonItems.Select(x =&gt; x.ToObject&lt;Item&gt;(itemDeserializer)); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload