C# JSON.net 没有正确创建对象作为反序列化字典中的值

我有一个“设置”类,其中包含一个带有“InputBindings”类值的字典。使用 JSON.NET,它可以正确地将设置数据写入/序列化到 .json 文件中,但在读取/反序列化文件时,它不会正确创建对象。

我尝试使用“TypeNameHandling”和“Custom JsonConverter T”,但我不确定我是否正确使用它们,并且它没有像尝试一样解决我的问题。我一直在查看文档,但我不确定此时该尝试什么。我不确定为什么它正确序列化所有内容但没有正确反序列化它。

这是相关的类,去掉了一些不必要的东西,比如枚举、日志记录和我为字典分配的默认值。

public static class PlayerInput
{
    public static Settings InputSettings { get; private set; } = new Settings();

    public static void Initialize()
    {
        SetSettingsToDefaults();
        FileOps.WriteSettingsToFile();
        FileOps.ReadSettingsFromFile();
    }
}

public class Settings
{
    public PlayerInput.MovementStyleEnum MovementStyle { get; set; } = PlayerInput.MovementStyleEnum.ScreenSpace;
    public PlayerInput.InputModeEnum InputMode { get; set; } = PlayerInput.InputModeEnum.KeyboardAndMouse;
    public Dictionary<InputBinding.GameInputsEnum, InputBinding> InputBindingsKBM { get; set; } = new Dictionary<InputBinding.GameInputsEnum, InputBinding>();
    public Dictionary<InputBinding.GameInputsEnum, InputBinding> InputBindingsController { get; set; } = new Dictionary<InputBinding.GameInputsEnum, InputBinding>();
}

public class InputBinding
{
    public GameInputsEnum InputName { get; private set; }
    public InputTypeEnum InputType { get; private set; }
    public string InputButton { get; private set; }
    public KeyCode InputKey { get; private set; }
    public int InputMouseButton { get; private set; }

    public InputBinding(GameInputsEnum _inputName, InputTypeEnum _inputType, string _inputButton, KeyCode _inputKey, int _mouseButton)
    {
        this.InputName = _inputName;
        this.InputType = _inputType;
        this.InputButton = _inputButton;
        this.InputKey = _inputKey;
        this.InputMouseButton = _mouseButton;
    }
}

public static class FileOps
{
    private const string SettingsFilePath = "Settings.json";

    public static bool ReadSettingsFromFile()
    {
        if(File.Exists(SettingsFilePath) == false)
        {
            return false;
        }
        else
        {
            Settings settings = JsonConvert.DeserializeObject<Settings>(File.ReadAllText(SettingsFilePath));
            // Looping through the dictionaries in settings here is where the objects don't seem to properly reflect what is written in the .json file
            return true;
        }
    }

    public static void WriteSettingsToFile()
    {
        File.WriteAllText(SettingsFilePath, JsonConvert.SerializeObject(PlayerInput.InputSettings, Formatting.Indented));
    }
}

FileOps.WriteSettingsToFile() 正确创建了一个看起来应该有的 .json 文件。https://pastebin.com/DZ5paXgY

当我使用一些 foreach 循环遍历 FileOps.ReadSettingsFromFile() 读取的设置时,它表明它没有正确地在字典中创建 InputBinding 对象。https://pastebin.com/FP2DaAaE

字典的键被正确填充,但值是为每个键重复的相同默认值。

例如:

“暂停:提交,,无,0”

从输出的第 6 行开始应该看起来像

"Pause : Pause, , , 27, 0" 反映了您从 .json 文件的第 19 行开始看到的内容。

亚历克斯·威斯

首先,不要在参数名称中使用下划线。下划线前缀应该只用于字段而不是参数。其次,由于下划线,JSON.NET 无法将 JSON 属性映射到构造函数参数。

删除下划线,JSON.NET 将能够将 JSON 映射到参数。

public class InputBinding
{
    public GameInputsEnum InputName { get; private set; }
    public InputTypeEnum InputType { get; private set; }
    public string InputButton { get; private set; }
    public KeyCode InputKey { get; private set; }
    public int InputMouseButton { get; private set; }

    public InputBinding(GameInputsEnum inputName, InputTypeEnum inputType, string inputButton, KeyCode inputKey, int mouseButton)
    {
        this.InputName = inputName;
        this.InputType = inputType;
        this.InputButton = inputButton;
        this.InputKey = inputKey;
        this.InputMouseButton = mouseButton;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

json.net在C#中反序列化json对象

将没有根对象的json反序列化为c#/ vb.net类

在 C# 中反序列化 (.net json) 或序列化 (XmlSerializer) 期间填充 NULL 值

C#JSON.net无法从文件反序列化和重新序列化对象

Json反序列化为对象C#Json.net

没有属性名称的Json.Net反序列化字典

Json.Net:序列化/反序列化属性作为值,而不是一个对象

Json.NET没有正确反序列化System.Range属性

使用带有JSON.NET C#的内部类的json文件反序列化

JSON反序列化对象-.NET

使用 json.net 将 JSON 反序列化为 c# 中的对象

使用C#.NET Core反序列化json

如何反序列化没有名称的JSON.NET对象?

Json.net没有反序列化对象列表

在JSON.NET中反序列化接口对象

我的Web API C#.net服务器无法反序列化JSON对象

序列化,反序列化C#/ JSON对象并且没有大小写问题

在JSON.NET中反序列化具有不同名称的对象列表

如何使用 Autodesk PLM 中的 C# 反序列化 JSON.NET 文本

根据.Net(C#)中的字段反序列化json

C#使用json.net反序列化JSON,想要提取数组索引作为模型属性

在C#中反序列化JSON对象

在C#中反序列化JSON:对象与数组

在 C# 中反序列化嵌套的 .json 对象

在C#中反序列化具有int作为键的JSON

使用C#中的嵌套类反序列化JSON。在哪里创建对象实例?

Json.Net序列化/反序列化类名称属性C#

在 C# 中反序列化 JSON 值数组

直接将Json.net JSON文件反序列化为C#字典类型?