【发布时间】:2018-03-27 15:22:05
【问题描述】:
这基本上是问题Newtonsoft Object → Get JSON string 的后续。
我有一个看起来像这样的对象:
[JsonConverter(typeof(MessageConverter))]
public class Message
{
public Message(string original)
{
this.Original = original;
}
public string Type { get; set; }
public string Original { get; set; }
}
我的要求是在初始化时将原始 JSON 字符串存储为对象的一部分。我已经能够(部分)使用自定义JsonConverter 成功实现这一点,然后基本上在JsonConverter 中执行类似的操作:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == Newtonsoft.Json.JsonToken.Null)
return null;
JObject obj = JObject.Load(reader);
return new Message(obj.ToString(Formatting.None))
{
Type = obj["type"].ToString()
};
}
但是我遇到的问题是当我尝试使用类似的东西从Message 继承时
public class CustomMessage : Message
{
public string Prop1 { get; set; }
}
由于显而易见的原因,我的代码失败了,因为它试图返回一个新的Message() 而不是一个新的CustomMessage()。
没有用我的所有子类型实现一个大的 if 语句并使用 JObject["prop"].ToObject<T>() 之类的东西手动绑定,我如何才能成功填充 Original 属性,同时仍然使用默认反序列化绑定我的所有子类型值?
注意:这样做的原因是因为原始消息可能包含实际上没有被绑定的数据,所以我不能只添加一个按原样序列化对象的属性。
【问题讨论】:
-
这是错字吗?? return new GDAXMessage 还是 return new Message ??
-
是的,抱歉,错字已修复。
-
看看How can I serialize and deserialize a type with a string member that contains “raw” JSON, without escaping the JSON in the process。您应该可以将
[JsonConverter(typeof(RawConverter))]申请到Original。 -
@dbc 这有点帮助,因为我应该将自定义序列化程序添加到属性中是有道理的,但问题是 Original 不是 JSON 消息的一部分并被跳过。基本上我需要您提供的示例,但需要运行时默认值提供程序。
标签: c# json json.net deserialization