Unity Serialize / Десериализация списка списков - PullRequest
0 голосов
/ 21 мая 2018

В настоящее время я борюсь с анализом 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);

    }
}

Все перед данными ""поле работает, но как только оно переходит к данным, публичная переменная уничтожается, я пробовал разные методы, но она либо возвращает ноль, либо уничтожает переменную, без ошибок, ничего

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

У вас есть переменная List of List:

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

API JsonUtility не поддерживает это.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.Вы можете получить это здесь .Стандартный Newtonsoft.Json не будет работать в Unity.

0 голосов
/ 21 мая 2018

выполнение некоторого обратного инжиниринга очищает JsonUtility of Unity странно ведет себя с вложенными массивами и возвращает нули.но вы можете использовать newtonsoft json deserializer, он поддерживает множество версий .Net, включая 3.5 для единства.

просто поместите файл dll в папку плагинов, и он больше не будет возвращать ноль:

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

https://www.newtonsoft.com/json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...