【问题标题】:Converting arrays of arrays to json将数组数组转换为json
【发布时间】:2018-07-05 14:11:41
【问题描述】:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

string filename = "data.json";
string jsonString;
string path;

[System.Serializable]
public class LevelGrid
{
    public string[] rows;
}

[System.Serializable]
public class Levels
{
    public LevelGrid[] levels;
}

void LoadGrid()
{
    // Load data
    string path = Application.streamingAssetsPath + "/" + filename;
    jsonString = File.ReadAllText(path);
    var levelBricks = JsonUtility.FromJson<Levels>(jsonString);

    // DOESNT WORK
    Debug.Log(levelBricks.levels[0]); 

}

我的 data.json 是:

 {
     "Levels": [
         {"Level1": ["1,1,1,1,1", "1,1,1,1,1", "1,1,1,1,1"]},
         {"Level2": ["1,1,1,1,1", "1,1,1,1,1", "1,0,1,0,1"]}
     ]
 }

levelBricks int 有问题,没有从 json 正确加载。我究竟做错了什么? Debug.Log 给出一个错误,如果我只 Debug.Log “levelBricks”,我得到的只是“Levels”。我希望能够访问 Level1 和 Level2 中的数组。

【问题讨论】:

  • 什么是JsonUtility.FromJson
  • 用 json.net 代替 JsonUtility 试试 newtonsoft.com/json
  • OP 正在使用 Unity,据我所知 JSON.NET 在 Unity 中不可用。除此之外,错误很明显。 Level1Level2 键是动态的,C# 类不反映...
  • 不确定 Unity,但您可以使用此类 public class Levels { public Dictionary&lt;string, string[]&gt;[] levels; } 反序列化为 JSON.Net,这样可能会起作用。
  • 话虽如此,如果我使用 JSON.Net,我可能会为动态属性使用自定义转换器。

标签: c# arrays unity3d


【解决方案1】:

主要问题是您的类变量应该使用与您的 json 相同的名称。 例子: 公共字符串[] 行;

应该是 公共字符串[] 级别;

编辑。 你需要一个可序列化的类

    [SerializeField] ClassForLevel12[] levels;

    public ClassName() {
    }

    public ClassName(ClassForLevel12[] levels) {
      this.levels = levels;
    }

和getter/setter

    public static ClassName SaveFromString(string 
jsonString) {
          return JsonUtility.FromJson<ClassName>(jsonString);
         }

    public string SaveToString() {
      return JsonUtility.ToJson(this);
    }

和一个可序列化的类 ClassForLevel12 与 2

    public string[] level1;
    public string[] level2;

(以及其他类的所有内容)。

最终编辑。 好的,这就是您所需要的,只需复制、粘贴和理解即可:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class MyLevels{
  [SerializeField] List<LevelGrid> levels;
  public MyLevels(){}
  public MyLevels(List<LevelGrid> levels){
    this.levels = levels;
  }
  public List<LevelGrid> Levels{
    get { return levels; }
    set { levels = value; }
  }
  //from a jsonstring to an object
  public static MyLevels SaveFromString(string jsonString){
    return JsonUtility.FromJson<MyLevels>(jsonString);
  }
  //object to json
  public string SaveToString(){
    return JsonUtility.ToJson(this);
  }

}

二等

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class LevelGrid{
    [SerializeField] string[] level1;
    [SerializeField] string[] level2;
    public LevelGrid() {
    }
    public LevelGrid(string[] level1, string[] level2) {
      this.level1 = level1;
      this.level2 = level2;
    }
    public string[] Level1{
      get { return level1; }
      set { level1 = value; }
    }
    public string[] Level2{
      get { return level2; }
      set { level2 = value; }
    }
    //from a jsonstring to an object
    public static LevelGrid SaveFromString(string jsonString) {
      return JsonUtility.FromJson<LevelGrid>(jsonString);
    }
    //object to json
    public string SaveToString() {
      return JsonUtility.ToJson(this);
    }
}

现在你可以打电话了

    string jsonString = "{ \"levels\": [ {\"level1\": [\"1,1,1,1,1\", \"1,1,1,1,1\", \"1,1,1,1,1\"]},{\"level2\":[\"1,1,1,1,1\", \"1,1,1,1,1\", \"1,0,1,0,1\"]}]}";
    MyLevels levelBricks = MyLevels.SaveFromString(jsonString);
    Debug.Log(levelBricks.Levels[0].Level1[0]);

【讨论】:

  • Levels 类有一个名为 levels 的属性。将行更改为 Levels 不会解决这个问题
  • 它仍然缺少 level1 和 level2。此外,rows 变量作为顶级可序列化是错误的
  • 现在,当 json 包含 level3level4 时会发生什么?你看,这是不对的
  • json 应该反映类中的数据。 Unity 库仅对基本类型和少数复杂类型(如 List)提供基本支持。我敢肯定有很多比 Unity 默认更好的更好的库,但是如果您需要使用 Unity3d 默认库,这是一个正确的答案。 docs.unity3d.com/Manual/script-Serialization.html这是文档
  • 我不确定我是否理解这个答案。你能像 Id 代码一样写出来吗?@Mah
猜你喜欢
  • 1970-01-01
  • 2014-01-23
  • 2014-10-10
  • 2011-08-02
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多