反序列化Minecraft json的更好方法

反序列化Minecraft json的更好方法,json,vb.net,visual-studio-2013,deserialization,Json,Vb.net,Visual Studio 2013,Deserialization,我正在尝试使用Minecraft jsonfrom()。样本: { “对象”:{ “realms/lang/de_de.lang”:{ “散列”:“729B2C09D5C58887B23127EEDA2730F9C039194”, “尺寸”:7784 }, “realms/lang/cy_GB.lang”:{ “散列”:“7b52463b2df4685d2d82c5d257fd5ec79843d618”, “尺寸”:7688 }, “地雷船/声音/暴徒/火焰/呼吸4.ogg”:{ “散列”:“7

我正在尝试使用Minecraft jsonfrom()。样本:

{
“对象”:{
“realms/lang/de_de.lang”:{
“散列”:“729B2C09D5C58887B23127EEDA2730F9C039194”,
“尺寸”:7784
},
“realms/lang/cy_GB.lang”:{
“散列”:“7b52463b2df4685d2d82c5d257fd5ec79843d618”,
“尺寸”:7688
},
“地雷船/声音/暴徒/火焰/呼吸4.ogg”:{
“散列”:“78d544a240d627005aaef6033fd646eafc66fe7a”,
“尺寸”:22054
},
“minecraft/sounds/dig/sand4.ogg”:{
“散列”:“37afa06f97d58767a1cd1382386db878be1532dd”,
“尺寸”:5491
}
}
}
实际的json要长得多,大约2940行


我需要一种不完全疯狂的反序列化方法——使用JSONUtils我可以得到4411行代码,但相同的代码不能用于任何其他版本的Minecraft。

自动化工具可能非常有用,但它们并不完美——尤其是在字典方面

首先要注意的是,它们的结构都是相同的,即它们都由
hash
size
属性组成。这意味着我们可以反复使用同一个类,而不是创建数百个相同的类:

”从机器人重复的类型:
公共类雷击物品
作为字符串的公共属性哈希
公共财产规模为Int32
末级
由于自动化工具在运行中(它们不向前看,也不向后看),它们并不真正知道它们都是一样的。接下来,机器人生成的类在这种情况下不起作用:

Public Property minecraft/sounds/music/game/creative/creative3.ogg As_
MineCraftsoundsMusicgame CreativeCreative3OGG
作为属性名称,这是非法的。但是,这些名称可以很好地用作字典键。除了上面的
MinecraftItem
类之外,我们可能还需要一个容器类:

公共类容器
作为字典的公共对象(字符串,MinecraftItem)
末级
获取数据的方法(至少)有三种:

方法1:取出单个项目
导入Newtonsoft.Json
导入Newtonsoft.Json.Linq
Dim jstr作为字符串=…从何处开始
'将json解析为JObject
Dim js As JObject=JObject.Parse(jstr)
“如果你知道这些名字,你可以提取数据:
Dim mi=js(“对象”)(“minecraft/sounds/mob/blaze/hit2.ogg”)
Console.WriteLine(mi(“散列”).ToString&&mi(“大小”).ToString)
第一行将原始json字符串解析为JObject。这允许我们以各种方式处理内容。例如,我们可以在json中引用“objects”,并按名称将项目命名,这正是下一行中发生的情况:

”深入“对象”,获取“…hit2.ogg”项
Dim mi=js(“对象”)(“minecraft/sounds/mob/blaze/hit2.ogg”)
如果您只需要从大文件中获取特定项,这将起作用。创建的
mi
变量是一个“特殊”的json标记,因此使用名称获取所需的数据位

hash=mi(“hash”).ToString
大小=米(“大小”)。ToString
方法2:反序列化到字典 这将是我的首选方法。包括与第一个示例中相同的
Import
语句,然后:

”解析json字符串
Dim js As JObject=JObject.Parse(jstr)
'将内部“对象”反序列化到网络字典
Dim myItems=JsonConvert.DeserializeObject(字典的)(字符串的_
MinecraftItem)(js(“对象”).ToString)
这将从json创建
myItems
作为净
字典(字符串,MincraftItem)
。因为
MinecraftObject
类除了保存字典之外什么都不做,所以我们跳过了它

键是长名称,每个值都是一个
MinecraftItem
,允许您更常规地引用它们:

”将其中一个项目放入变量中
gravel3=myItems(“地雷工艺/声音/暴徒/小鸡/step2.ogg”)
ConsoleWriteLine(“Gravel3散列:{0},大小:{1}”,
gravel3.hash,gravel3.size.ToString)
若你们不熟悉它,它有点像一个数组或列表,除非你们通过
键而不是索引来访问你们的项目。要循环遍历它们,请执行以下操作:

Dim n作为整数=0
对于myItems中的每个kvp作为KeyValuePair(字符串、MinecraftItem的)
WriteLine(“名称:{0}哈希:{1}大小:{2}”,
kvp.Key,
kvp.Value.hash,
kvp.Value.size.ToString)
n+=1
如果n>=2,则退出“仅打印3
下一个
输出:

名称:realms/lang/de_de.lang哈希:10a54fc66c8f479bb65c8d39c3b62265ac82e742大小:8112
名称:realms/lang/cy_GB.lang哈希:14cfb2f24e7d91dbc22a2a0e3b880d9829320243大小:7347
名称:minecraft/sounds/mob/chicken/step2.ogg散列:BF7FADAF64945F6B31C803D086AC6A652ABEF9B大小:3838

请记住,键始终是长路径名,每个
.Value
都是
MinecraftItem
对象

方法3:反序列化到容器 您可以使用
MinecraftContainer
类跳过解析步骤:

Dim jstr As String=…从何处开始
Dim myJItems=JsonConvert.DeserializeObject(属于MinecraftContainer)(jstr)
请注意,这一次,您将下载的整个字符串传递到
jsonvert
。结果将是一个额外的外部对象,它包含一个名为“Objects”的字典属性。因此,您可以使用一些前导引用来引用项目:

gravel3hash=myJItems.Object(“minecraft/sounds/dig/gravel3.ogg”).hash
gravel3=myJItems.Object(“minecraft/sounds/dig/gravel3.ogg”)
ConsoleWriteLine(“Gravel3散列:{0},大小:{1}”,
gravel3.hash,gravel3.size.ToString)
“或:
控制台写入线(“G