【问题标题】:Json.net deserialize dictionary and assign dictionary key to dictionary value's member variableJson.net 反序列化字典并将字典键分配给字典值的成员变量
【发布时间】:2021-02-11 05:06:03
【问题描述】:

假设我有一个这样的 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;
  }

但是,如果我们现在想将 Store 类嵌入到另一个类(例如 Company)中,然后从 JSON 中反序列化呢?

class Company
{
  public Store[] stores;
}

现在JsonConvert.DeserializeObject&lt;Company&gt;(json) 将无法按预期工作,并且不会分配 item.Id。

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

【问题讨论】:

  • 你必须使用这个类Public Store [] stores;当您有商店列表时

标签: c# json.net


【解决方案1】:

输入问题后,我立即发现 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 格式,并且需要一些自定义。

【讨论】:

  • 可以,不过好像明天才能接受。
  • 我明白了,这样的延迟接受答案并不新鲜。顺便说一句,您的 JSON 示例在语法上是错误的。我个人的看法是,如果你有一个定义良好的 json 结构。总是有它反序列化成的简单对象(在 VisualStudio 中,您可以通过复制 json 对象,然后单击 Edit -&gt; Paste special -&gt; Paste JSON as Classes 来完成此操作),然后通过创建新的专用对象等进行任何您想做的修改。
猜你喜欢
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 2014-02-19
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
相关资源
最近更新 更多