【问题标题】:Unity Serialize / De-serialize List of List of Listunity Serialize / De-serialize List of List 列表
【发布时间】:2018-05-21 18:16:59
【问题描述】:

我目前正在为 JSON 解析而苦苦挣扎。

我的 json 文件是用 Construct 2 生成的,它在这个 json(地图包)中包含 json 文件(地图)

这是地图包的示例(仅包含一张地图)

{"c2array":true,"size":[1,1,1],"data":[[["{\"c2array\":true,\"size\":[22,9,1],\"data\":[[[\"wall\"],[0],[0],[10],[480],[0],[0],[0],[0]],[[\"wall\"],[0],[470],[860],[10],[0],[0],[0],[0]],[[\"wall\"],[850],[0],[10],[470],[0],[0],[0],[0]],[[\"wall\"],[10],[0],[840],[10],[0],[0],[0],[0]],[[\"wall\"],[160],[190],[110],[140],[0],[0],[0],[0]],[[\"wall\"],[340],[280],[140],[130],[0],[0],[0],[0]],[[\"wall\"],[520],[120],[190],[150],[0],[0],[0],[0]],[[\"plateform\"],[415],[140],[0],[0],[0],[0],[0],[0]],[[\"plateform\"],[195],[160],[0],[0],[0],[1],[5],[5]],[[\"launcher\"],[415],[280],[0],[0],[0],[0],[5],[1]],[[\"ray\"],[15],[90],[0],[0],[0],[0],[5],[1]],[[\"spawn\"],[365],[265],[0],[0],[0],[0],[0],[0]],[[\"mine\"],[465],[280],[0],[0],[0],[0],[5],[0]],[[\"plateformspike\"],[65],[350],[0],[0],[0],[0],[0],[0]],[[\"plateformspike\"],[185],[390],[0],[0],[0],[1],[10],[2]],[[\"spike\"],[520],[185],[0],[0],[270],[0],[0],[0]],[[\"spike\"],[545],[270],[0],[0],[180],[0],[0],[0]],[[\"spike\"],[635],[270],[0],[0],[180],[0],[0],[0]],[[\"spike\"],[710],[175],[0],[0],[90],[0],[0],[0]],[[\"spike\"],[645],[120],[0],[0],[0],[0],[0],[0]],[[\"spike\"],[615],[470],[0],[0],[0],[0],[0],[0]],[[\"flag\"],[225],[190],[0],[0],[0],[0],[0],[0]]]}"]]]}

现在要加载这个 json 文件,我使用以下 C# 脚本:

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

public class mapLoad : MonoBehaviour {
    public string jsonString;
    public C2Map valeur;


    public bool c2array;
    public List<int> size;
    public List<List<List<string>>> data;

    // Use this for initialization
    void Start () {
        jsonString = File.ReadAllText(Application.dataPath + "/Maps/MapFiles/Test/document.json");
        C2Map valeur = C2Map.CreateFromJSON(jsonString);
        c2array = valeur.c2array;
        size = valeur.size;
        data = valeur.data;
    }

    // Update is called once per frame
    void Update () {

    }
}
[System.Serializable]
public class C2Map
{

    public bool c2array;
    public List<int> size;
    public List<List<List<string>>> data;

    public static C2Map CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<C2Map>(jsonString);

    }
}

“数据”字段之前的所有内容都有效,但是一旦进入数据,公共变量就会被破坏,我尝试了不同的方法,但它要么返回 null 要么破坏变量,没有错误,什么都没有

【问题讨论】:

  • 这个问题可能与你的 json 无关。读取部分可能会失败,因为它返回 null。您将要读取的 json 文件放在哪里?
  • 嘿!感谢您的回复,我的文件在我的统一文件夹中,该文件确实正在被读取,因为它正在填充 c2array 和 size bool/list 但不是数据(完全删除检查器变量)
  • 你的 json 文件在 data 上有一些问题,它实际上是一个由单个字符串组成的数组,你可以使用jsoneditoronline.org等在线工具自己查看
  • 它是故意这样做的,基本上,我将地图存储为单个字符串,然后将字符串作为数组中的新 json 加载;现在在 Unity 上我只想将字符串加载为字符串,而不是序列化它
  • “公共变量被破坏,我尝试了不同的方法,但它要么返回 null,要么破坏变量,没有错误,什么都没有”。哪些?

标签: c# json list parsing unity3d


【解决方案1】:

你有 List of List 变量的列表:

public List<List<List<string>>> data;

JsonUtility API 不支持此功能。 JsonUtility 只支持简单类型。如果您尝试序列化包含上述变量的类,您将得到[],并且在您尝试反序列化它时可能为 null。

你有两个选择:

1.为List&lt;List&lt;List&lt;string&gt;&gt;&gt;写一个包装器

[System.Serializable]
public class ListWrapper
{
    public List<ThirdList> secondList;
}

[System.Serializable]
public class ThirdList
{
    public List<string> thirdList;
}

然后

在您的 C2Map 类中将其声明为 public List&lt;ListWrapper&gt; data;

2。使用 Newtonsoft.Json Unity 的分叉版本。你可以得到here。标准的 Newtonsoft.Json 在 Unity 中不起作用。

【讨论】:

    【解决方案2】:

    做一些逆向工程可以清除 Unity 的 JsonUtility 对嵌套数组和返回 null 有一个奇怪的行为。 但是您可以使用 newtonsoft json 反序列化器,它支持多种 .Net 版本,包括统一的 3.5。

    只需将 dll 文件放在 Plugins 文件夹中,它就不会再返回 null:

    public static C2Map CreateFromJSON(string jsonString)
        {
            return JsonConvert.DeserializeObject<C2Map>(jsonString);
        }
    

    https://www.newtonsoft.com/json

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2020-11-22
      相关资源
      最近更新 更多