tun*_*h24 5 c# serialization json json.net
我正在研究一种协议,其中接收方将接收某些指定的自定义类型(当前为5,但可能为10-20)的json消息。我正在努力想出一个最优/快速的解决方案,它将自动反序列化json并返回正确类型的对象。
例:
public class MessageA
{
public string Message;
}
public class MessageB
{
public int value;
}
public class MessageC
{
public string ValueA;
public string ValueB;
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,方法应类似于
Object Deserialize(string json);
Run Code Online (Sandbox Code Playgroud)
它将返回三种消息类型之一或为null-如果发生解析错误/ json与任何预定义类型都不匹配。
更新:我可以控制发送器/接收器以及协议设计。
Sco*_*nen 11
如果消息可以指定其类型,将很有帮助。否则,您必须从某些属性或其他属性中推断出它。
您可以在序列化时使用消息包装器类,如下所示:
public class MessageWrapper<T>
{
public string MessageType { get { return typeof(T).FullName; } }
public T Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您的类Name具有First和Last属性,则可以像这样序列化它:
var nameMessage = new MessageWrapper<Name>();
nameMessage.Message = new Name {First="Bob", Last = "Smith"};
var serialized = JsonConvert.SerializeObject(nameMessage);
Run Code Online (Sandbox Code Playgroud)
序列化的JSON是
{"MessageType":"YourAssembly.Name","Message":{"First":"Bob","Last":"Smith"}}
Run Code Online (Sandbox Code Playgroud)
反序列化时,首先将JSON反序列化为这种类型:
public class MessageWrapper
{
public string MessageType { get; set; }
public object Message { get; set; }
}
var deserialized = JsonConvert.DeserializeObject<MessageWrapper>(serialized);
Run Code Online (Sandbox Code Playgroud)
从MessageType属性中提取消息类型。
var messageType = Type.GetType(deserialized.MessageType);
Run Code Online (Sandbox Code Playgroud)
知道类型之后,就可以反序列化Message属性了。
var message = JsonConvert.DeserializeObject(
Convert.ToString(deserialized.Message), messageType);
Run Code Online (Sandbox Code Playgroud)
message是object,但您可以将其强制转换为Name或实际使用的任何类。
| 归档时间: |
|
| 查看次数: |
5955 次 |
| 最近记录: |