如何反序列化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寻求帮助。

+0

你试图反序列化哪一个?在名称中允许空格可能会导致问题:“示例配置”将不匹配“Example_Config” – Plutonix

+0

您是从其他地方获得这些空间还是这些是您的发明?我问,因为看起来将它们组合起来会更容易,而不是试图从A – Plutonix

+0

中的文本中找到B。所以我需要做的是:加载配置,然后加载所选配置的设置。 – ProGamingHun

您需要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) 

有一些改进和提醒:

  1. 当存储路径文字时,不使用转义字符。使用"C:\path\file\..."而不是"C:\\path\\file\\..."。序列化器增加额外的\ s
  2. 如前所述,而不是解析Enabled来确定全屏,我会使用Booleam。
  3. 我会避免在名称破折号,斜线和空格等和钥匙
  4. 有些事情可能会更好,因为枚举或类型,"MCF_1.0"例如,所以您不必对它进行解析,以确定它是否是11.12.0
  5. 由于配置位于字典中,因此如果您不熟悉这些配置,可能需要了解如何使用它们。
+0

你应该发布一个新的问题,以便代码格式正确 - 我不能读取。然而,由于它不是一个数组,你需要使用'For Each' – Plutonix