热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

反序列化Minecraftjson的更好方法

反序列化Minecraf

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

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

' the type that repeats from your robot:
Public Class MinecraftItem
Public Property hash As String
Public Property size As Int32
End Class

由于自动化工具在运行中(它们不会向前看…或向后看),因此他们并不真正知道它们是否相同。接下来的事情是,在这种情况下,机器人生成的类将无法工作:

Public Property minecraft/sounds/music/game/creative/creative3.ogg As _
MinecraftsoundsMusicGameCreativeCreative3Ogg

作为属性名称,这是非法的。但是,这些名称可以用作Dictionary键。除了上述MinecraftItem类之外,我们 可能还 需要一个容器类:

Public Class MinecraftContainer
Public objects As Dictionary(Of String, MinecraftItem)
End Class

至少有3种获取数据的方法:

方法1:拔出单个项目

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Dim jstr As String = ...from whereever
' parse the json into a JObject
Dim js As JObject = JObject.Parse(jstr)
' if you somehow know the names, you can pluck out the data:
Dim mi = js("objects")("minecraft/sounds/mob/blaze/hit2.ogg")
Console.WriteLine(mi("hash").ToString & " " & mi("size").ToString)

第一行将原始json字符串解析为JObject。这使我们能够以各种方式处理内容。例如,我们可以在json中引用“对象”,并按名称引用它们,这正是下一行所发生的情况:

' drill into "objects", get the "...hit2.ogg" item
Dim mi = js("objects")("minecraft/sounds/mob/blaze/hit2.ogg")

如果您只需要从大文件中获取特定的项目,这将起作用。mi创建的变量是“特殊” json令牌,因此请使用名称来获取所需的数据位

hash = mi("hash").ToString
size = mi("size").ToString

方法2:反序列化为词典

这将是 我的 首选方法。包括与Import第一个示例相同的语句,然后:

' parse the json string
Dim js As JObject = JObject.Parse(jstr)
' deserialize the inner "objects" to a NET Dictionary
Dim myItems = JsonConvert.DeserializeObject(Of Dictionary(Of String, _
MinecraftItem))(js("objects").ToString)

这将从json 创建myItems为Net Dictionary(Of String,
MincraftItem)
。由于MinecraftObject该类除了保留字典外 什么 也不做,因此我们跳过了它。

这些键是长名称,每个值都是一个MinecraftItem,使您可以更常规地引用它们:

' get one of the items into a variable
gravel3 = myItems("minecraft/sounds/mob/chicken/step2.ogg")
ConsoleWriteLine("Gravel3 hash: {0}, size: {1}",
gravel3.hash, gravel3.size.ToString)

如果您不熟悉.Net字典,则它有点像数组或列表,只是您通过一个Key而不是索引来访问项目。要遍历它们:

Dim n As Integer = 0
For Each kvp As keyvaluepair(Of String, MinecraftItem) In myItems
Console.WriteLine("Name: {0} Hash: {1} size: {2}",
kvp.Key,
kvp.Value.hash,
kvp.Value.size.ToString)
n += 1
If n >= 2 Then Exit For ' just print 3
Next

输出:

名称:三界/郎/ de_DE.lang哈希:10a54fc66c8f479bb65c8d39c3b62265ac82e742尺寸:8112
姓名:三界/郎/ cy_GB.lang哈希:14cfb2f24e7d91dbc22a2a0e3b880d9829320243尺寸:7347
姓名:我的世界/声音/暴民/鸡肉/
step2.ogg哈希:bf7fadaf64945f6b31c803d086ac6a652aabef9b尺寸:3838

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

方法3:反序列化到容器

您可以使用以下MinecraftContainer类跳过分析步骤:

Dim jstr As String = ...from whereever
Dim myJItems = JsonConvert.DeserializeObject(Of MinecraftContainer)(jstr)

请注意,这次,您将 下载的整个字符串 传递给JsonConvert。结果将是一个额外的外部对象,其中包含一个名为“
Objects”的字典属性。因此,您使用一些主要参考文献来引用这些项目:

gravel3hash = myJItems.Object("minecraft/sounds/dig/gravel3.ogg").hash
gravel3 = myJItems.Object("minecraft/sounds/dig/gravel3.ogg")
ConsoleWriteLine("Gravel3 hash: {0}, size: {1}",
gravel3.hash, gravel3.size.ToString)
'or:
ConsoleWriteLine("Gravel3 hash: {0}, size: {1}",
myJItems.Object("minecraft/sounds/dig/gravel3.ogg").hash,
myJItems.Object("minecraft/sounds/dig/gravel3.ogg").size.ToString)

此方法只是要反序列化的一行代码,但这意味着
a)我必须定义容器类,
b)我必须使用myJItems.Object钻入否则为空的容器才能获得Dictionary。

就个人而言,我会放弃使用方法2-额外增加一行代码,使其更易于使用。也就是说,您还可以从容器中提取字典集合:

Dim myItems As Dictionary(Of String, MinecraftItem)= myJItems.Object





推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了获取关联数组键的列表的方法,即使用Object.keys()函数。同时还提到了该方法在不同浏览器的支持情况,并附上了一个代码片段供读者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
author-avatar
龙龙玖号_367
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有