首页 > 解决方案 > 使用 Newtonsoft 反序列化为数据类型时遇到错误

问题描述

问题很简单:我正在尝试制作一个不和谐的机器人,它所需要的只是加载有关机器人在初始化时所在的所有行会的所有信息。

我没有完全尝试任何事情,因为一切看起来都很好。我不想留下这个硬编码并制作一个不友好的库,这就是我仍在尝试这个的原因。

这是我到目前为止所拥有的:[Json File]

{
    "Guilds": [
        {
            "ID": 561524447828246535,
            "GuildName": "TestGuild",
            "Filter": [ "words", "words2" ]
        }
    ]
}

【提取类】

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using J = Newtonsoft.Json.JsonPropertyAttribute;

using System;
using System.Collections.Generic;
using System.Globalization;

namespace Cuvue.JSONManagment
{
    public static class JSONManager<Generic>
    {
        public static List<Generic> ListFromJson(string directory) => JsonConvert.DeserializeObject<List<Generic>>(directory, Converter.Settings);

        public static Generic TypeFromJson(string directory) => JsonConvert.DeserializeObject<Generic>(directory, Converter.Settings);

        public static string IntoJson(Generic type) => JsonConvert.SerializeObject(type, Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }
}

[公会数据类]

using J = Newtonsoft.Json.JsonPropertyAttribute;

namespace Cuvue.JSONManagment
{
    public partial class GuildData
    {
        [J("Guilds")] public Guild[] Guilds { get; set; }
    }

    public partial class Guild
    {
        [J("ID")] public long Id { get; set; }
        [J("GuildName")] public string GuildName { get; set; }
        [J("Filter")] public string[] Filter { get; set; }
    }
}

[实例化点]

        private async Task Async()
        {
            Client = new DiscordSocketClient(new DiscordSocketConfig
            {
                AlwaysDownloadUsers = true,
                ConnectionTimeout = 2000,
                LogLevel = LogSeverity.Debug
            });

            Commands = new CommandService(new CommandServiceConfig
            {
                SeparatorChar = ';',
                ThrowOnError = false,
                DefaultRunMode = RunMode.Async,
                CaseSensitiveCommands = true,
                LogLevel = LogSeverity.Debug
            });

            string Token = JSONManager<BotData>.TypeFromJson(BotDataJSON).Token;

            Client.MessageReceived += ClientMessageReceived;

            await Commands.AddModulesAsync(assembly: Assembly.GetEntryAssembly(), services: null);

            Client.Ready += ClientIsReady;
            Client.Log += Logging;

            await Client.LoginAsync(TokenType.Bot, Token);
            await Client.StartAsync();

            #region Populating Lists

            //Guilds = JSONManager<GuildData>.ListFromJson(GuildDataJSON);

            #endregion

            await Task.Delay(-1);
        }

[错误信息]

'Unexpected character encountered while parsing value: G. Path '', line 0, position 0.'

嗯……嗯……我希望 JSON 能够反序列化为 GuildData 类并应用于 GuildList 列表。在调试应用程序崩溃。更不用说在尝试为机器人接收令牌时也会发生同样的情况。

标签: c#jsonjson.netdiscord.net

解决方案


推荐阅读