通过以下内容类型使用动态对象JSON反序列化-C#
我有一个JSON字符串,它的对象不同,这取决于消息的类型。例如: 文本通过以下内容类型使用动态对象JSON反序列化-C#,c#,json,json.net,C#,Json,Json.net,我有一个JSON字符串,它的对象不同,这取决于消息的类型。例如: 文本 { "message": { "name": "sender", "from": "60123456789", "id": "ABGGYBJlBxcPAgo6zXukA7i8jnSe", "timestamp": "1585125726", "type": "text", "text": { "body": "Hi" } } public class
{
"message": {
"name": "sender",
"from": "60123456789",
"id": "ABGGYBJlBxcPAgo6zXukA7i8jnSe",
"timestamp": "1585125726",
"type": "text",
"text": {
"body": "Hi"
}
}
public class InboundMessageText
{
public Message Message { get; set; }
}
public class Message
{
public string Name { get; set; }
public string From { get; set; }
public string Id { get; set; }
public int Timestamp { get; set; }
public string Type { get; set; }
public TextMessage Text { get; set; }
}
public class TextMessage
{
public string Body { get; set; }
}
图像
{
"message": {
"name": "sender",
"from": "60123456789",
"id": "ABGGYBJlBxcPAgo6zXukA7i8jnSe",
"timestamp": "1585125726",
"type": "image",
"image": {
"mime_type": "image/jpeg",
"link": "http://lala.com/Files/image.jpeg",
"caption": "your image caption"
}
}
public class InboundMessageImage
{
public Message Message { get; set; }
}
public class Message
{
public string Name { get; set; }
public string From { get; set; }
public string Id { get; set; }
public int Timestamp { get; set; }
public string Type { get; set; }
public ImageMessage Image{ get; set; }
}
public class ImageMessage
{
public string Mime_Type { get; set; }
public string Link { get; set; }
public string Caption { get; set; }
}
还有更多。name
、from
、id
等键仍然相同
因此,我在代码中所做的是,我必须为每种类型创建对象:
文本对象
{
"message": {
"name": "sender",
"from": "60123456789",
"id": "ABGGYBJlBxcPAgo6zXukA7i8jnSe",
"timestamp": "1585125726",
"type": "text",
"text": {
"body": "Hi"
}
}
public class InboundMessageText
{
public Message Message { get; set; }
}
public class Message
{
public string Name { get; set; }
public string From { get; set; }
public string Id { get; set; }
public int Timestamp { get; set; }
public string Type { get; set; }
public TextMessage Text { get; set; }
}
public class TextMessage
{
public string Body { get; set; }
}
图像对象
{
"message": {
"name": "sender",
"from": "60123456789",
"id": "ABGGYBJlBxcPAgo6zXukA7i8jnSe",
"timestamp": "1585125726",
"type": "image",
"image": {
"mime_type": "image/jpeg",
"link": "http://lala.com/Files/image.jpeg",
"caption": "your image caption"
}
}
public class InboundMessageImage
{
public Message Message { get; set; }
}
public class Message
{
public string Name { get; set; }
public string From { get; set; }
public string Id { get; set; }
public int Timestamp { get; set; }
public string Type { get; set; }
public ImageMessage Image{ get; set; }
}
public class ImageMessage
{
public string Mime_Type { get; set; }
public string Link { get; set; }
public string Caption { get; set; }
}
这就是我反序列化的方式
var inboundMessage = JsonConvert.DeserializeObject <InboundMessageText> ("json string");
var addInboundMessage = new Data.Domain.InboundMessage {
From = inboundMessage.Message.From,
Name = inboundMessage.Message.Name,
MessageId = inboundMessage.Message.Id,
MessageTimestamp = DateTimeOffset.FromUnixTimeSeconds(inboundMessage.Message.Timestamp).LocalDateTime,
};
if (inboundMessage.Message.Type == "text") {
addInboundMessage.InboundType = InboundType.Text;
addInboundMessage.Text = inboundMessage.Message.TextMessage.Body;
}
else if (inboundMessage.Message.Type == "image") {
//So here I have to deserialize again for image object
var inboundMessageImage = JsonConvert.DeserializeObject <InboundMessageImage>("json string");
addInboundMessage.InboundType = InboundType.Image;
//Business logic
}
//and many type more...
var inboundMessage=JsonConvert.DeserializeObject(“json字符串”);
var addInboundMessage=new Data.Domain.InboundMessage{
From=inboundMessage.Message.From,
Name=inboundMessage.Message.Name,
MessageId=inboundMessage.Message.Id,
MessageTimestamp=DateTimeOffset.FromUnixTimeSeconds(inboundMessage.Message.Timestamp).LocalDateTime,
};
如果(inboundMessage.Message.Type==“text”){
addInboundMessage.InboundType=InboundType.Text;
addInboundMessage.Text=inboundMessage.Message.TextMessage.Body;
}
else if(inboundMessage.Message.Type==“image”){
//所以这里我必须再次反序列化图像对象
var inboundMessageImage=JsonConvert.DeserializeObject(“json字符串”);
addInboundMessage.InboundType=InboundType.Image;
//业务逻辑
}
//还有很多类型的。。。
代码正在运行,但是我有超过7种类型的消息,所以我的代码太长了
有可能简化代码吗?您可以组合到超级对象并检查项目是否为空
public class InboundMessageText
{
public Message Message { get; set; }
}
public class Message
{
public string Name { get; set; }
public string From { get; set; }
public string Id { get; set; }
public int Timestamp { get; set; }
public string Type { get; set; }
public TextMessage Text { get; set; }
public ImageMessage Image{ get; set; }
}
public class ImageMessage
{
public string Mime_Type { get; set; }
public string Link { get; set; }
public string Caption { get; set; }
}
public class TextMessage
{
public string Body { get; set; }
}
var inboundMessage = JsonConvert.DeserializeObject <InboundMessageText> ("json string");
if (inboundMessage.Message.Type == "text") {
//InboundType.Text ;
}
if (inboundMessage.Message.Type == "image") {
// InboundType.Image;
}
公共类InboundMessageText
{
公共消息{get;set;}
}
公共类消息
{
公共字符串名称{get;set;}
来自{get;set;}的公共字符串
公共字符串Id{get;set;}
公共int时间戳{get;set;}
公共字符串类型{get;set;}
公共文本消息文本{get;set;}
公共图像消息图像{get;set;}
}
公共类ImageMessage
{
公共字符串Mime_类型{get;set;}
公共字符串链接{get;set;}
公共字符串标题{get;set;}
}
公共类文本消息
{
公共字符串体{get;set;}
}
var inboundMessage=JsonConvert.DeserializeObject(“json字符串”);
if(inboundMessage.Message.Type==“text”){
//InboundType.Text;
}
如果(inboundMessage.Message.Type==“image”){
//内边界类型。图像;
}
您可以管理任何消息的基类,以及特定类型的类(文本
,图像
,等等),就像这样
公共类基本消息
{
公共字符串名称{get;set;}
来自{get;set;}的公共字符串
公共字符串Id{get;set;}
公共int时间戳{get;set;}
公共字符串类型{get;set;}
}
公共类ImageMessage:BaseMessage
{
公共ImageMessageContent图像{get;set;}
}
公共类TextMessage:BaseMessage
{
公共文本消息内容文本{get;set;}
}
公共类ImageMessageContent
{
公共字符串Mime_类型{get;set;}
公共字符串链接{get;set;}
公共字符串标题{get;set;}
}
公共类TextMessageContent
{
公共字符串体{get;set;}
}
请注意,我稍微更改了类的命名。不需要为每种类型的消息和容器创建单独的类
之后,您可以将JSON字符串解析为,获取类型
值,并使用方法根据该值创建具体的消息
实例
var json=JObject.Parse(jsonString);
var type=json[“message”]?[“type”]?.Value();
基本信息;
开关(类型)
{
案例“文本”:
message=json[“message”]?.ToObject();
打破
案例“图像”:
message=json[“message”]?.ToObject();
打破
}
为什么每种类型都需要一个单独的
消息
类?您应该使用JsonConverter来处理这个问题。看,太好了,我找到了简单的方法!谢谢