如何访问嵌套json中的动态嵌套json(如中所示,我无法知道预先确定的值和键)



问候我的堆叠伙伴。我正在unity中重新创建minecraft构建(是的,我确实知道mineways可以通过.obj->.fbx来实现(我之所以想做这样的事情,只是因为我希望所有的块都是单独的,并且用户可以简单地与之交互(只需输入保存的构建和ta daaam的路径,构建在unity项目中(我在minecraft中使用WorldEdit将构建保存到.schem文件中,然后使用nuget中的NbtLib对其进行反序列化,导出为.json文件。

问题:尽管json文件具有一些常量属性,例如:;PaletteMax"宽度"高度";还有一些动态值如块类型:;minecraft:石头"minecraft:基岩;。

问题:知道一些值是动态的,如何访问它们并将其存储在变量中以供统一使用(我知道这主要是一个c#问题,因此这个问题在stackoverflow上(

json文件的示例代码:

{
"PaletteMax": 2,
"Palette": {
"minecraft:stone": 0,
"minecraft:bedrock": 1
},
"Version": 2,
"Length": 2,
"Metadata": {
"WEOffsetX": -3,
"WEOffsetY": 0,
"WEOffsetZ": -2
},
"Height": 1,
"DataVersion": 2975,
"BlockData": [0, 1, 1, 0],
"BlockEntities": [],
"Width": 2,
"Offset": [1, -52, 2]
}

来自c#:的示例代码

private void deserialize()
{
using (var inputStream = File.OpenRead(input_path + file_name + ".schem"))
{
var nbtData = NbtConvert.ParseNbtStream(inputStream);
var dataObj = new RootNBT();
var tag = new NbtCompoundTag();
Debug.Log(nbtData.Count);
foreach(var key in nbtData.Keys)
{
switch (key)
{
case ("Length"):
INbtTag value;
nbtData.TryGetValue(key, out value);
dataObj.Length = int.Parse(value.ToJsonString());
Debug.Log(dataObj.Length); // this would output as 2 since the Length property in json above is 2
break;
case ("Palette"):
//this is the dynamic json part, can't access "minecraft:stone" without knowing its name
}
}
} 
}

以防万一,这里有一个指向NbtLib的链接,我用来将.schem文件反序列化为json

设法找到了解决方案!!

因此,基本上,我将嵌套的json视为一个单独的json,将其存储在一个变量中,并对根组件执行相同的操作。唯一的问题是解析后的流的类型是NbtCompoundTag,子json的类型是INbtTag,所以我只是将其转换为NbtCompundTag,它就工作了!

var value2 = (NbtCompoundTag)value1;

^这句话解决了我的问题。后来我把它当作一本字典,在那里我可以访问它的密钥

private void deserialize()
{
using (var inputStream = File.OpenRead(input_path + file_name + ".schem"))
{
var nbtData = NbtConvert.ParseNbtStream(inputStream);
var dataObj = new RootNBT();
var tag = new NbtCompoundTag();
Debug.Log(nbtData.Count);
foreach(var key in nbtData.Keys)
{
switch (key)
{
case ("Length"):
INbtTag value;
nbtData.TryGetValue(key, out value);
dataObj.Length = int.Parse(value.ToJsonString());
Debug.Log(dataObj.Length);
break;
case ("Palette"):
INbtTag value1;
nbtData.TryGetValue(key, out value1);
var value2 = (NbtCompoundTag)value1;
foreach(var paletteKey in value2.Keys)
{
Debug.Log(paletteKey);
INbtTag keyValue;
value2.TryGetValue(paletteKey, out keyValue);
}
break;
}
}
}
}

最新更新