【问题标题】:Unity C#: how to convert an Array of a class into JSON [duplicate]Unity C#:如何将类的数组转换为 JSON [重复]
【发布时间】:2016-07-15 07:27:39
【问题描述】:

我需要保存多个玩家的数据。我通过制作一组 PlayersInfo 类并尝试将数组转换为 JSON 来做到这一点。这是我的代码

  PlayerInfo[] allPlayersArray = new PlayerInfo[1];

  allPlayersArray[0] = new PlayerInfo();
  allPlayersArray[0].playerName = "name 0";

  string allPlayersArrayJson = JsonUtility.ToJson(allPlayersArray);
  print(allPlayersArrayJson);
  PlayerPrefs.SetString("allPlayersArrayJson", allPlayersArrayJson);

  string newJson = PlayerPrefs.GetString("allPlayersArrayJson");
  print(newJson);

  PlayerInfo[] newArray = new PlayerInfo[1];

  newArray = JsonUtility.FromJson<PlayerInfo[]>(newJson);

  print(newArray[0].playerName);

前两个打印语句返回“{}”,第三个给出空引用错误。 TIA

【问题讨论】:

  • Unity Json Serializer 不直接支持这个。你需要一个助手类来让它工作。我认为这是一个重复的问题。这是你的答案stackoverflow.com/a/36244111/3785314 从上面写着 2.MULTIPLE DATA(ARRAY JSON) 的地方开始阅读
  • 谢谢@Programmer,你能帮我实际使用它吗?我刚刚复制了辅助类,现在我想知道如何使用它来转换我的数组?请注意,我需要进一步修改该数组。
  • 我发布的答案的链接向您展示了执行此操作的步骤。向下滚动并尝试关注他们。如果有问题,请告诉我。然后我会发布一个解决方案。在我发布答案之前,您必须告诉我您尝试了什么。
  • 这是我尝试过的。 'PlayerInfo[] firstArray = new PlayerInfo[1]; firstArray[0].playerName = "Name1";字符串 firstJSON = JsonHelper.ToJson(firstArray); PlayerPrefs.SetString("playerInfo", firstJSON); string firstString = PlayerPrefs.GetString("playerInfo"); PlayerInfo[] secondArray = new PlayerInfo[1]; secondArray = JsonHelper.FromJson(firstString); secondArray[0].playerName = "Name2";字符串 secondString = JsonHelper.ToJson(secondArray); PlayerPrefs.SetString("playerInfo", secondString); string thirdString = PlayerPrefs.GetString("playerInfo");
  • 但它在第二条语句中给出了空引用错误。

标签: arrays json unity3d


【解决方案1】:

就像我在评论中所说,没有直接支持。需要Helper 类。这是我做出这个答案的唯一原因是因为即使在阅读了我提供的链接后您仍然遇到问题。

创建一个名为JsonHelper 的新脚本。复制并粘贴下面的代码。

using UnityEngine;
using System.Collections;
using System;

public class JsonHelper
{

    public static T[] FromJson<T>(string json)
    {
        Wrapper<T> wrapper = UnityEngine.JsonUtility.FromJson<Wrapper<T>>(json);
        return wrapper.Items;
    }

    public static string ToJson<T>(T[] array)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return UnityEngine.JsonUtility.ToJson(wrapper);
    }

    [Serializable]
    private class Wrapper<T>
    {
        public T[] Items;
    }
}

您问题中的代码现在应该可以工作了。您所要做的就是用JsonHelper 替换所有JsonUtility 单词。我在下面为你做了这个:

void Start()
{
    PlayerInfo[] allPlayersArray = new PlayerInfo[1];

    allPlayersArray[0] = new PlayerInfo();
    allPlayersArray[0].playerName = "name 0";

    string allPlayersArrayJson = JsonHelper.ToJson(allPlayersArray);
    print(allPlayersArrayJson);
    PlayerPrefs.SetString("allPlayersArrayJson", allPlayersArrayJson);

    string newJson = PlayerPrefs.GetString("allPlayersArrayJson");
    print(newJson);

    PlayerInfo[] newArray = new PlayerInfo[1];

    newArray = JsonHelper.FromJson<PlayerInfo>(newJson);

    print(newArray[0].playerName);
}

【讨论】:

  • 它作为示例工作。谢谢你。让我稍后在我的实际项目中尝试一下,我会打勾作为答案。
  • 慢慢来。让我知道是否有任何问题。虽然,应该没有。
  • 效果很好。非常感谢。
【解决方案2】:

基于 JsonUtility documentation,不支持裸数组。将数组放在一个类中。

在内部,此方法使用 Unity 序列化器;因此 您传入的对象必须由序列化程序支持:它必须是 MonoBehaviour、ScriptableObject 或普通类/结构 应用了可序列化的属性。

通常,您将使用它来序列化 MonoBehaviour 对象,或带有 Serializable 属性的自定义类/结构。

【讨论】:

    【解决方案3】:

    是的!目前不支持它,但总有一种解决方法。使用这个类:

    public static class JsonHelper
    {
        public static T[] getJsonArray<T>(string json)
        {
            try
            {
                string newJson = "{ \"array\": " + json + "}";
                Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>> (newJson);
                return wrapper.array;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    
        [Serializable]
        private class Wrapper<T>
        {
            public T[] array = null;
        }
    }
    

    【讨论】:

      【解决方案4】:

      我会使用Json.NET

      PlayerInfo[] allPlayersArray = new PlayerInfo[] { p1, p2, p3 };
      
      string json = JsonConvert.SerializeObject(allPlayersArray);
      

      More On SerializeObject

      (代码示例尚未测试)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-11
        • 2012-02-08
        • 1970-01-01
        • 2017-09-06
        • 2021-11-06
        • 1970-01-01
        • 2021-05-23
        • 2021-03-22
        相关资源
        最近更新 更多