c # С Unity и LitJSON Получение исключения недопустимого приведения при попытке десериализации обратно из объекта JSONData - PullRequest
0 голосов
/ 12 ноября 2018

Я работал над решением по сохранению игры для своего проекта и столкнулся со стеной. После нескольких дней исследований, проб / ошибок и т. Д. Я решил дать стеку шанс. Я пытаюсь преобразовать обратно из текстового файла Json в объект, а затем добавить его в словарь. Он продолжает выдавать мои недопустимые исключения приведения независимо от того, как я выполняю итерацию по объекту Jdata. Помня о том, что я использую стороннюю компанию LitJson. Вот код на данный момент. Ошибка возникает в операторе foreach.

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

    public static class SaveGame  {


    public static string savePath = Application.persistentDataPath + 
   "/Saves/";
    public static int numberOfSaves = 0;
    public static string saveFileName = PlayerCrew.playerShipName + ".json";

    public static void SavePlayerData ()
    {
        string playerSavePath = savePath + saveFileName;
        string jsonHolder;

        jsonHolder = JsonMapper.ToJson(PlayerCrew.playerCrewManifest);

        if (!File.Exists(playerSavePath))
        {
            FileStream fs = new FileStream(playerSavePath, 
    FileMode.OpenOrCreate);
            fs.Close();
            File.WriteAllText(playerSavePath, jsonHolder);          

        }
        else
        {
            File.WriteAllText(playerSavePath, jsonHolder);
        }

     }

     public static void LoadCrewManifest()
     {
        string playerSavePath = savePath + saveFileName;
        string jsonHolder;

        jsonHolder = File.ReadAllText(playerSavePath);
        JsonData jdata = JsonMapper.ToObject(jsonHolder);
        PlayerCrew.playerCrewManifest.Clear();

        foreach (KeyValuePair<string,CrewMember> item in jdata)
        {
            PlayerCrew.playerCrewManifest.Add(item.Key, item.Value);
            Debug.Log(item.Key);
        }

    }





    }

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Значения в jdata могут принимать значение KeyValuePair<string, string>

самый простой способ - это простой конструктор для вашего класса CrewMember например. что-то вроде

[Serializable]
public class CrewMember
{
    public string Name;

    public CrewMember(string name)
    {
        Name = name;
    }
}

Чем вам не нужен item.key, так как это будет имя переменной (в данном случае Name), вместо этого вы хотите item.Value.

Ваш код JSON может выглядеть как

JsonData jdata = JsonMapper.ToObject(jsonHolder);
PlayerCrew.playerCrewManifest.Clear();

foreach (KeyValuePair<string,string> item in jdata)
{
    PlayerCrew.playerCrewManifest.Add(item.Value, new CrewMember(item.Value));
    Debug.Log(item.Value);
}
0 голосов
/ 12 ноября 2018

Я рекомендую вам использовать NetJson . Вы можете десериализовать с использованием универсального типа, включая словарь.

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