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格式,需要一些定制。
假设我有一个像这样的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格式,需要一些定制。