通过以下内容类型使用动态对象JSON反序列化-C#

通过以下内容类型使用动态对象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

我有一个JSON字符串,它的对象不同,这取决于消息的类型。例如:

文本

{
"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来处理这个问题。看,太好了,我找到了简单的方法!谢谢