假设我有以下模型类:
public class Action
{
public enum Type
{
Open,
Close,
Remove,
Delete,
Reverse,
Alert,
ScaleInOut,
Nothing
}
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("active")]
[JsonConverter(typeof(IntToBoolConverter))]
public bool Active { get; set; }
[JsonProperty("type")]
[JsonConverter(typeof(ActionTypeConverter))]
public Type ActionType { get; set; }
[JsonProperty("result")]
[JsonConverter(typeof(ActionResultConverter))]
public ActionResult Result { get; set; }
}
我想把下面的JSON反序列化到这个类中:
{
"name":"test1",
"id":"aa0832f0508bb580ce7f0506132c1c13",
"active":"1",
"type":"open",
"result":{
"property1":"buy",
"property2":"123.123",
"property3":"2016-07-16T23:00:00",
"property4":"768",
"property5":true
}
}
结果对象每次可以不同(6个模型之一),其类型取决于JSON属性type
。
我已经创建了自定义ActionResultConverter
(Action
类的Result
属性上面的JsonConverter
注解),应该能够基于JSON的type
属性中的字符串创建特定的result
对象。
我的问题是,我不知道如何从转换器访问该属性,因为只有整个JSON的result
部分被传递给JsonReader
。
任何想法或帮助将不胜感激。
谢谢!
2条答案
按热度按时间z5btuh9x1#
Json.NET不提供在反序列化子对象时访问JSON层次结构中父对象的属性值的方法。这可能是因为根据standard,JSON对象被定义为一个 * 无序的名称/值对集 *,因此无法保证所需的父属性出现在JSON流中的子属性之前。
因此,与其在
ActionResult
的转换器中处理Type
属性,不如在Action
本身的转换器中处理:注意
ReadJson()
中使用了JsonSerializer.Populate()
。这会自动填充Action
的所有属性,而不是Result
,从而避免了手动反序列化每个属性的需要。Demo fiddle在这里:https://dotnetfiddle.net/2I2oVP
jecbmhm32#
关于http://json.codeplex.com/discussions/56031:
在编辑器中编码,所以错别字抱歉:)