反序列化C#中的复杂JSON,Twitch Pubsub
我从通道点事件中获得这个Json字符串 我想把这个字符串转换成以下变量: 编辑:我用Json2CSharp.com更新了这些分类反序列化C#中的复杂JSON,Twitch Pubsub,c#,json,api,publish-subscribe,twitch,C#,Json,Api,Publish Subscribe,Twitch,我从通道点事件中获得这个Json字符串 我想把这个字符串转换成以下变量: 编辑:我用Json2CSharp.com更新了这些分类 public class User { public string id { get; set; } public string login { get; set; } public string display_name { get; set; } } public class Image
public class User
{
public string id { get; set; }
public string login { get; set; }
public string display_name { get; set; }
}
public class Image
{
public string url_1x { get; set; }
public string url_2x { get; set; }
public string url_4x { get; set; }
}
public class DefaultImage
{
public string url_1x { get; set; }
public string url_2x { get; set; }
public string url_4x { get; set; }
}
public class MaxPerStream
{
public bool is_enabled { get; set; }
public int max_per_stream { get; set; }
}
public class Reward
{
public string id { get; set; }
public string channel_id { get; set; }
public string title { get; set; }
public string prompt { get; set; }
public int cost { get; set; }
public bool is_user_input_required { get; set; }
public bool is_sub_only { get; set; }
public Image image { get; set; }
public DefaultImage default_image { get; set; }
public string background_color { get; set; }
public bool is_enabled { get; set; }
public bool is_paused { get; set; }
public bool is_in_stock { get; set; }
public MaxPerStream max_per_stream { get; set; }
public bool should_redemptions_skip_request_queue { get; set; }
}
public class Redemption
{
public string id { get; set; }
public User user { get; set; }
public string channel_id { get; set; }
public string redeemed_at { get; set; }
public Reward reward { get; set; }
public string user_input { get; set; }
public string status { get; set; }
}
public class Data
{
public string timestamp { get; set; }
public Redemption redemption { get; set; }
}
public class Root
{
public string type { get; set; }
public Data data { get; set; }
}
我尝试了不同的方法来反序列化Json字符串,但没有任何效果。
我最后一次尝试如下:(编辑)
这个问题有很多不清楚的地方。 问题不清楚,输入数据和期望没有得到适当解释 在后期,问题中共享的JSON不是来自
e.Data
的值
不管怎么说,开始解决真正的问题
e.Data
本身是一个JSON字符串,它有一个子属性,而子属性又是一个JSON字符串
因此,需要进行双重JSON去序列化
以下是第一级反序列化所需的类
public class MessageData
{
public string topic { get; set; }
public string message { get; set; }
}
public class DataRoot
{
public string type { get; set; }
public MessageData data { get; set; }
}
e.Data
字符串表示DataRoot
类的JSON结构。所以您需要首先反序列化DataRoot对象,如下所示
var rootData = JsonConvert.DeserializeObject<DataRoot>(e.Data);
var json = rootData.data.message;
var myDeserializedClass = JsonConvert.DeserializeObject<Root>(json);
private static void SocketMessage(object sender, MessageEventArgs e)
{
try
{
var rootData = JsonConvert.DeserializeObject<DataRoot>(e.Data);
var json = rootData.data.message;
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(json);
Console.WriteLine(myDeserializedClass.data.redemption.reward.title);
}
catch(Exception ex)
{
Console.Write(ex);
}
}
rootData.data.message
表示上面声明的Root
类的JSON结构。因此,您需要如下反序列化它
var rootData = JsonConvert.DeserializeObject<DataRoot>(e.Data);
var json = rootData.data.message;
var myDeserializedClass = JsonConvert.DeserializeObject<Root>(json);
private static void SocketMessage(object sender, MessageEventArgs e)
{
try
{
var rootData = JsonConvert.DeserializeObject<DataRoot>(e.Data);
var json = rootData.data.message;
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(json);
Console.WriteLine(myDeserializedClass.data.redemption.reward.title);
}
catch(Exception ex)
{
Console.Write(ex);
}
}
var json=rootData.data.message;
var myDeserializedClass=JsonConvert.DeserializeObject(json);
因此,代码的最终版本如下所示
var rootData = JsonConvert.DeserializeObject<DataRoot>(e.Data);
var json = rootData.data.message;
var myDeserializedClass = JsonConvert.DeserializeObject<Root>(json);
private static void SocketMessage(object sender, MessageEventArgs e)
{
try
{
var rootData = JsonConvert.DeserializeObject<DataRoot>(e.Data);
var json = rootData.data.message;
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(json);
Console.WriteLine(myDeserializedClass.data.redemption.reward.title);
}
catch(Exception ex)
{
Console.Write(ex);
}
}
private static void SocketMessage(对象发送方,MessageEventArgs e)
{
尝试
{
var rootData=JsonConvert.DeserializeObject(e.Data);
var json=rootData.data.message;
根myDeserializedClass=JsonConvert.DeserializeObject(json);
Console.WriteLine(myDeserializedClass.data.redemption.reward.title);
}
捕获(例外情况除外)
{
控制台写入(ex);
}
}
我希望这将帮助您解决问题。您是否有任何错误?什么错误?您需要使用为您拥有的json创建c#类。@ChetanRanpariya遗憾的是没有错误。那么您面临的问题是什么?您有一个没有代码的catch块,因此即使抛出异常,它也会被默默地吞掉,您永远不知道是否发生了异常。
不起作用
不会解释您遇到的问题的任何内容它是同一个字符串。你可以查一下。。您是否调试了代码并检查了e
是否为空以及e.Data
是否为空?在阅读您的解决方案之前,我意识到来自e.Data的日期与文档中的数据完全不同。非常感谢您抽出时间。现在可以了!:)