如何反序列化json?
问题描述:
使用的配置来管理游戏modpacks我的应用程序,这样的配置加载器的工作原理是这样的:如何反序列化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,或全屏模式可以是相同的或不同的(未知的)变化。 我想按名称加载所有配置,并加载所选配置的设置。有人可以帮助我,我该如何反序列化这个JSON。
我正在使用Newtonsoft.Json
进行反序列化。
THX寻求帮助。
答
您需要2个班,一个包含配置集和各种“全球”数据,然后一类的物品:
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
创建集合类和存储配置项目吧:
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)
为了得到一个从集合中一起工作:
Dim thisCfg As ConfigItem = myCfgs.Configurations("Ziggy")
Console.WriteLine("Name: {0}, JavaPath: {1}, ModLoader: {2}",
thisCfg.Name, thisCfg.JavaPath, thisCfg.ModLoader)
的Outpu T:
名称:齐格,JavaPath:C:\ PROGRAMFILES \的Java \ JRE-XXX \斌\ javaw.exe的,ModLoader:MCF_1.0
要序列/保存:
' save all configs to disk:
Dim jstr = JsonConvert.SerializeObject(myCfgs)
File.WriteAllLines(saveFileName, jstr)
加载保存CONFIGS的最后一组:
' 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
来确定全屏,我会使用Booleam。 - 我会避免在名称破折号,斜线和空格等和钥匙
- 有些事情可能会更好,因为枚举或类型,
"MCF_1.0"
例如,所以您不必对它进行解析,以确定它是否是1
,1.1
或2.0
- 由于配置位于字典中,因此如果您不熟悉这些配置,可能需要了解如何使用它们。
+0
你应该发布一个新的问题,以便代码格式正确 - 我不能读取。然而,由于它不是一个数组,你需要使用'For Each' – Plutonix
你试图反序列化哪一个?在名称中允许空格可能会导致问题:“示例配置”将不匹配“Example_Config” – Plutonix
您是从其他地方获得这些空间还是这些是您的发明?我问,因为看起来将它们组合起来会更容易,而不是试图从A – Plutonix
中的文本中找到B。所以我需要做的是:加载配置,然后加载所选配置的设置。 – ProGamingHun