【发布时间】:2016-07-13 17:10:49
【问题描述】:
假设我有以下模型类:
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(Result 属性上方的JsonConverter 注释Action 类)应该能够创建特定 result 对象 基于 JSON 的 type 属性中的字符串。
我的问题是我不知道如何从转换器访问该属性,因为只有整个 JSON 的 result 部分被传递给 JsonReader。
任何想法或帮助将不胜感激。
谢谢!
【问题讨论】:
-
您可以反序列化为与 json 结构匹配的类,并使用该类来确定您希望数据最终进入哪种类型的自定义类。或者使用动态。鸡肉培根牧场。
-
另外,您的
type属性是open。open的枚举值为 0。字符串到整数的转换不是很好。如果您反序列化为与 json 结构匹配的类,然后转换为最终游戏类,则此转换也可能是您从字符串转换为 int (Enum) 的地方。 -
另外,您将枚举命名为与流行的系统类相同:msdn.microsoft.com/en-us/library/system.type(v=vs.110).aspx 可能会让一些维护系统的人感到困惑。
-
@SteveG 反序列化
type属性没有问题,因为我也为此编写了自定义转换器,并且效果很好。使用dynamic是什么意思?我应该将 JSON 序列化为dynamic并手动将 JSON 解析为我的Action类? -
而且命名是故意的。只有在该类内部,它可能会令人困惑,因为使用了
Type名称本身。但在外面它必须用作Action.Type和Action.ActionType对我来说似乎有点奇怪:)