Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反序列化C#中的复杂JSON,Twitch Pubsub_C#_Json_Api_Publish Subscribe_Twitch - Fatal编程技术网

反序列化C#中的复杂JSON,Twitch Pubsub

反序列化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

我从通道点事件中获得这个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 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的日期与文档中的数据完全不同。非常感谢您抽出时间。现在可以了!:)