【问题标题】:How can I pull the 2D array out of this JSON file?如何从这个 JSON 文件中提取二维数组?
【发布时间】:2018-02-02 11:48:12
【问题描述】:

我想知道如何从下面的 JSON 文件中提取二维数组。我正在使用 Unity,最好使用 Newtonsoft.Json

{ "height":8,
 "infinite":false,
 "layers":[
        {
         "data":[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
         "height":8,
         "name":"Tile Layer 1",
         "opacity":1,
         "type":"tilelayer",
         "visible":true,
         "width":8,
         "x":0,
         "y":0
        }],
 "nextobjectid":1,
 "orientation":"orthogonal",
 "renderorder":"right-down",
 "tiledversion":"1.1.2",
 "tileheight":64,
}

这不是一个重复的问题,因为它涉及在 JSON 文件中具有嵌套数组的独特情况,特别是我想使用 Newtonsoft.JSON。

【问题讨论】:

  • 你的二维数组在哪里?
  • 这里没有二维数组,Newtonsoft 不需要这样做。如果您仍想使用 Newtonsoft,请继续

标签: c# arrays json unity3d


【解决方案1】:

如果您想使用 Newtonsoft(以及几乎任何其他 JSON 库),您只需要创建一个类来保存反序列化的对象:

public class Layer
{
    public IEnumerable<int> Data {get;set;}
    public int Height {get;set;}
    // ... implement other properties
}

public class MyObject
{
    public int Height {get;set;}
    public bool Infinite {get;set;}
    public IEnumerable<Layer> Layers {get;set;}
    // ... implement other properties
}

然后将字符串反序列化到你的对象中:

using Newtonsoft.Json.JsonConvert;
....
var myObject = DeserializeObject<MyObject>(jsonString);
foreach (var layer in myObject.Layers)
{
    // do something with each layer, e.g. get the sum of the data
    var sum = layer.data.Sum();
}

【讨论】:

  • 谢谢,这是一个清晰且易于实施的答案
  • @Jim 请注意问题顶部的链接答案 (stackoverflow.com/questions/36239705/…),关于内置 Unity 序列化程序和 Newtonsoft 库分支的性能。我正在使用最新的 Unity 和实验性的 .Net 4.6 运行时,所以我不需要担心不兼容问题——对你来说可能不是这样,但因为你确实要求使用那个库...... (虽然我认为 JSON 性能是否是您项目中的问题,但您做错了什么)
【解决方案2】:

如果Unity支持c# 4自带的动态关键字,那么你可以直接赋值

dynamic obj = JsonConvert.DeserializeObject(jsonData);

然后您将直接访问它:obj.layers.data

如果包含的单声道框架不支持动态关键字,你可以做的是创建一个数据模型,它是一个具有所有属性的简单类,并以类似的方式分配它。

YourModel obj = JsonConvert.DeserializeObject<YourModel>(jsonData);

【讨论】:

  • 我是否必须制作一个基本上是Json文件镜像的数据模型?你能帮忙澄清一下吗?不支持动态关键字。
  • 是的,您将创建 json 的 c# 表示。如果您使用键作为变量名,JsonConverter 将自动反序列化,无需额外的需求。 ideone.com/W8qlsW@吉姆
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2023-03-16
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多