Json.net反序列化字典并将字典键分配给字典值的成员变量

Json.net deserialize dictionary and assign dictionary key to dictionary value's member variable

假设我有一个像这样的json

"inventory":{
  "sh0001":{
     "price":100
  },
  "sh0002":{
     "price":50
  }
}

我想用 Json.net 将其反序列化为这样的数据结构

class Store
{
  public Dictionary<string, Item> inventory;
}
class Item
{
  [JsonIgnore] public string id;
  public int price;
}

我想使用字典键(例如“sh0001”)并将它们分配给值对象的 Id 变量(item.id = “sh0001”)。



一个明显的解决方案是添加一个方法,如 Store.OnJsonDeserialized(),并可能在工厂方法 Store.FromJson(string json) 中调用它,这样我们就不会忘记并在反序列化后调用它...

  public void OnJsonDeserialized()
  {
     foreach(var kvp in inventory)
        kvp.value.id = kvp.key;
  }

  public static Store FromJson(string json)
  {
     var newObj = JsonConvert.DeserializeObject<Store>(json);
     newObj.OnJsonDeserialized();
     return newObj;
  }

但是,如果我们现在想将商店 class 嵌入到另一个 class(例如公司)中,然后从 JSON 反序列化它呢?

class Company
{
  public Store[] stores;
}

现在 JsonConvert.DeserializeObject<Company>(json) 将无法正常工作,并且 item.Id 不会被分配。

在这种情况下,有没有更好的反序列化方法? 谢谢。

输入问题后,我立即发现 Json.net 支持一些 serialization callback attributes(来自 System.Runtime.Serialization),这正是我需要的。

    [OnDeserialized]
    internal void OnDeserializedMethod(StreamingContext context)
    {
        Member4 = "This value was set after deserialization.";
    }

或者,除了使用字典,还有 KeyedCollection<TKey,TItem>,这减少了对重复字典键的需求。缺点是默认不会反序列化和序列化成我想要的json格式,需要一些定制。