2015-07-12 91 views
1

使用的配置來管理遊戲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

回答

1

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