Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何反序列化json?_.net_Json_Vb.net_Serialization_Token - Fatal编程技术网

.net 如何反序列化json?

.net 如何反序列化json?,.net,json,vb.net,serialization,token,.net,Json,Vb.net,Serialization,Token,我的应用程序使用配置来管理游戏的modpack,因此配置加载程序的工作方式如下: 以下是configurations.json: { "GameDirectory": "C:\\Users\\username\\AppData\\Roaming\\.mp-craft-project", "Configurations": { "MP-Craft-Default": { "Name": "MP-Craft-Default", "JavaPath": "C:\

我的应用程序使用配置来管理游戏的modpack,因此配置加载程序的工作方式如下:

以下是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
进行反序列化


THX以获取帮助。

您需要两个类,一个包含配置集合和各种“全局”数据,然后是一个用于项目的类:

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)
输出:

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

要序列化/保存它,请执行以下操作:

' 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
  • 如前所述,我将使用Booleam,而不是解析
    Enabled
    来确定全屏
  • 我会避免在名称和键中使用破折号、斜杠和空格等
  • 有些东西作为枚举或类型可能更好,例如,
    “MCF_1.0”
    ,因此您不必解析它来确定它是
    1
    1.1
    还是
    2.0
  • 由于配置在字典中,如果您不熟悉它们,您可能希望了解如何使用它们

  • 你想反序列化哪一个?在名称中允许空格可能会导致问题:“示例配置”与“示例配置”不匹配。您是从其他地方获得这些还是您的发明?我之所以这么问,是因为将它们组合起来似乎比试图从ASo中的文本中找到B更容易。我需要做的是:加载配置,然后加载所选配置的设置。好吧,与其将实际配置保存在不同的json中,不如将名称保存在,保存实际配置…如下所示:您的配置存在一些问题-字符串数组包含2条信息-0、2、4。。。是“名称”,1、3、5将是文件名-难以管理。另外,如果这只是您的本地存储,并且您不将它们发送到任何地方,那么XML序列化程序将更适合JSON用于数据交换,如果这是本地存储,XML序列化将更好。无论哪种方式,编辑你的问题以获得你想要的答案。你应该发布一个新的问题,以便代码格式正确-我看不懂。但是,由于它不是一个数组,因此需要对每个