Unity序列化/反序列化列表列表

时间:2018-05-21 18:16:59

标签: c# json list parsing unity3d

我目前正在努力解决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]]]}"]]]}

现在使用以下C#脚本加载此json文件:

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);

    }
}

&#34;数据&#34;之前的所有内容字段工作,但一旦它转到数据,公共变量被破坏,我尝试了不同的方法但它返回null或销毁变量,没有错误,没有

2 个答案:

答案 0 :(得分:2)

您有List列表变量列表:

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

JsonUtility API不支持此功能。 JsonUtility仅支持简单类型。如果您尝试序列化包含上述变量的类,那么当您尝试对其进行反序列化时,您将获得[]并且可能为null。

您有两种选择:

1 。为List<List<List<string>>>

写一个包装器
[System.Serializable]
public class ListWrapper
{
    public List<ThirdList> secondList;
}

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

然后

public List<ListWrapper> data;课程中将其声明为C2Map

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

答案 1 :(得分:0)

做一些逆向工程清除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