如何反序列化json?

How to deserialize json?

我的应用程序使用配置来管理游戏的模组包,因此配置加载器以这种方式工作:

这是configurations.json:

{
"GameDirectory": "C:\Users\username\AppData\Roaming\.mp-craft-project",
"Configurations": {
    "MP-Craft-Default": {
        "Name": "MP-Craft-Default",
        "JavaPath": "C:\ProgramFiles\Java\jre-xxx\bin\javaw.exe",
        "FullScreenMode": "Enabled",
        "ModLoader": "MCF_1.0"
    },
    "New-Configuration": {
        "Name": "New-Configuration",
        "JavaPath": "C:\ProgramFiles\Java\jre-xxx\bin\javaw.exe",
        "FullScreenMode": "Enabled",
        "ModLoader": "MCF_2.0"
    }
  }
}

并且此 json 中的字符串例如 modloader 或 fullscreenmode 可以是相同或不同(未知)的变体。 我想按名称加载所有配置,并加载所选配置的设置。有人可以帮我吗,我该如何反序列化这个 json.

我正在使用 Newtonsoft.Json 反序列化。

感谢帮助。

您需要 2 个 class,一个包含配置 collection 和各种 "global" 数据,然后一个 class 用于项目:

Public Class Configs
    Public Property GameDirectory As String

    Public Property Configurations As Dictionary(Of String, ConfigItem)

    Public Sub New()
        Configurations = New Dictionary(Of String, ConfigItem)
    End Sub
End Class

Public Class ConfigItem
    Public Property Name As String

    Public Property JavaPath As String
    Public Property FullScreenMode As String            ' I would use Boolean
    Public Property ModLoader As String
End Class

要创建 collection class 并将配置项存储到其中:

Imports System.Environment
...
Dim myCfgs As New Configs
myCfgs.GameDirectory = Path.Combine(Environment.GetFolderPath(SpecialFolder.ApplicationData), ".mp-craft-project")

Dim p As New ConfigItem
p.Name = "Ziggy"
p.FullScreenMode = "Enabled"
p.ModLoader = "MCF_1.0"
p.JavaPath = "C:\ProgramFiles\Java\jre-xxx\bin\javaw.exe"

' add this item to the collection
myCfgs.Configurations.Add(p.Name, p)

' add another, create a new ConfigItem object
p = New ConfigItem
p.Name = "Hoover"
p.FullScreenMode = "Enabled"
p.ModLoader = "MCF_2.0"
p.JavaPath = "...javaw.exe"
myCfgs.Configurations.Add(p.Name, p)

要从 collection 中选出一个来工作:

Dim thisCfg As ConfigItem = myCfgs.Configurations("Ziggy")
Console.WriteLine("Name: {0}, JavaPath: {1}, ModLoader: {2}",
                  thisCfg.Name, thisCfg.JavaPath, thisCfg.ModLoader)

输出:

Name: Ziggy, JavaPath: C:\ProgramFiles\Java\jre-xxx\bin\javaw.exe, ModLoader: MCF_1.0

给serialize/save吧:

' save all configs to disk:
Dim jstr = JsonConvert.SerializeObject(myCfgs)
File.WriteAllLines(saveFileName, jstr)

加载最后一组保存的配置:

' load the text, then deserialize to a Configs object:
Dim jstr = File.ReadAllText(saveFileName)
Dim myCfgs As Configs = JsonConvert.DeserializeObject(Of Configs)(jstr)

有一些改进和注意事项:

  1. 存储路径文字时,不要使用转义字符。使用 "C:\path\file\..." 而不是 "C:\path\file\..."。序列化程序添加了额外的 \s
  2. 如前所述,我不会解析 Enabled 来确定全屏,而是使用布尔值。
  3. 我会避免在名称和键中使用破折号、斜杠和空格等
  4. 有些东西作为枚举或类型可能更好,例如 "MCF_1.0",因此您不必解析它来确定它是 11.1 还是 2.0
  5. 由于配置在字典中,如果您不熟悉它们,您可能需要阅读如何使用它们。