如何反序列化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)
有一些改进和注意事项:
- 存储路径文字时,不要使用转义字符。使用
"C:\path\file\..."
而不是 "C:\path\file\..."
。序列化程序添加了额外的 \
s
- 如前所述,我不会解析
Enabled
来确定全屏,而是使用布尔值。
- 我会避免在名称和键中使用破折号、斜杠和空格等
- 有些东西作为枚举或类型可能更好,例如
"MCF_1.0"
,因此您不必解析它来确定它是 1
、1.1
还是 2.0
- 由于配置在字典中,如果您不熟悉它们,您可能需要阅读如何使用它们。
我的应用程序使用配置来管理游戏的模组包,因此配置加载器以这种方式工作:
这是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)
有一些改进和注意事项:
- 存储路径文字时,不要使用转义字符。使用
"C:\path\file\..."
而不是"C:\path\file\..."
。序列化程序添加了额外的\
s - 如前所述,我不会解析
Enabled
来确定全屏,而是使用布尔值。 - 我会避免在名称和键中使用破折号、斜杠和空格等
- 有些东西作为枚举或类型可能更好,例如
"MCF_1.0"
,因此您不必解析它来确定它是1
、1.1
还是2.0
- 由于配置在字典中,如果您不熟悉它们,您可能需要阅读如何使用它们。