C#Discord Bot错误:Newtonsoft.Json.JsonReaderException

时间:2019-06-29 04:54:40

标签: c# .net-core discord

我正在尝试制作一个Discord机器人,但是在连接Discord API时遇到问题。我正在使用Visual Studio社区2019。我使用.net核心控制台应用程序模板启动了此项目。我的.net核心版本是2.2。我遵循了一些教程,甚至从git中提取了一些示例机器人,它们都给了我同样的Newtonsoft.Json.JsonReaderException未处理的异常错误。

我确实安装了Discord.Net nuget软件包2.1.1版,起初我很困惑,因为我以为我根本不处理json,但后来意识到discord.net nuget软件包也可以安装{{1 }}版本11.0.2。我尝试安装该软件包以查看是否能解决我的问题,但是没有,我尝试安装11.0.2版和12.0.2版(本文发布时为最新版本)。

运行该应用程序时,我的程序停止运行,Visual Studio指向我的静态void主函数。

newtonsoft.json

对于这种制造不和谐机器人的特殊尝试,我遵循了本指南:https://docs.stillu.cc/guides/getting_started/first-bot.html

该文章指出,如果在异步函数中引发任何异常,则将它们一直抛出,一直返回到第一个非异步方法(即主要方法)。那是否意味着错误出在我的MainAsync函数中?

如果我让应用程序崩溃,则确切的错误是:

Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: <. Path '', line 0, position 0.' 

这是我唯一的文件:

Exception thrown: 'Newtonsoft.Json.JsonReaderException' in System.Private.CoreLib.dll
An unhandled exception of type 'Newtonsoft.Json.JsonReaderException' occurred in System.Private.CoreLib.dll
Unexpected character encountered while parsing value: <. Path '', line 0, position 0.

如果我自己不处理json文件,有人可以向我解释为什么得到using System; using Discord; using System.Threading.Tasks; using Discord.WebSocket; namespace Bot { class Program { private DiscordSocketClient Client; static void Main() => new Program().MainAsync().GetAwaiter().GetResult(); public async Task MainAsync() { Client = new DiscordSocketClient(); Client.Log += Log; //This is my discord bot token var token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"; await Client.LoginAsync(TokenType.Bot, token); await Client.StartAsync(); await Task.Delay(-1); } private Task Log(LogMessage message) { Console.WriteLine(message.ToString()); return Task.CompletedTask; } } } 的原因,我该怎么做才能消除此错误? 感谢您的帮助。这也是我第一次在堆栈溢出中发布问题,因此,如果我在提出问题方面做得不好,请告诉我。

2 个答案:

答案 0 :(得分:0)

要跟踪错误,建议将每个调用包装在try / catch块中。然后记录错误发生的位置。

using System;
using Discord;
using System.Threading.Tasks;
using Discord.WebSocket;

namespace Bot
{
    class Program
    {
        private DiscordSocketClient Client;

        static void Main() => new Program().MainAsync().GetAwaiter().GetResult();

        public async Task MainAsync()
        {
            try{
            Client = new DiscordSocketClient();
            Client.Log += Log;
            }catch(Exception ex){log("Error in init:"); throw ex;}
            //This is my discord bot token
            var token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX";
            try{
            await Client.LoginAsync(TokenType.Bot, token);
            }catch(Exception ex){log("Error during login"); throw ex;}
            try{
            await Client.StartAsync();
            }catch(ex){log("Error starting client"); throw ex;
            await Task.Delay(-1);
        }
        private Task log(string message)
        {
            Console.WriteLine(message);
            return Task.CompletedTask;
        }            
        private Task Log(LogMessage message)
        {
            Console.WriteLine(message.ToString());
            return Task.CompletedTask;
        }
    }
}

随着项目规模的增加,还建议在消息中包含文件名和行号。

JSON似乎用作与Discord通信的API的一部分。 https://discordapp.com/developers/docs/intro 我看到参考资料是其中的几个主题,包括来自错误的消息。可能是您收到了一些http错误,例如404,其中包含html响应而不是预期的json,因此为什么该错误建议出现意外的'<'如 ... 而不是{as在{...}中,这只是预感。

答案 1 :(得分:0)

您的代码运行良好。我刚刚插入了我的令牌,机器人启动了。检查您的令牌是否正确,并可能将令牌设为字符串