Unity C#:如何将类的数组转换为 JSON [重复]

Posted

技术标签:

【中文标题】Unity C#:如何将类的数组转换为 JSON [重复]【英文标题】:Unity C#: how to convert an Array of a class into JSON [duplicate] 【发布时间】: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 不直接支持这个。你需要一个助手类来让它工作。我认为这是一个重复的问题。这是你的答案***.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"); 但它在第二条语句中给出了空引用错误。 【参考方案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

(代码示例尚未测试)

【讨论】:

以上是关于Unity C#:如何将类的数组转换为 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Unity C#简单JSON到数组[重复]

[转]C# 将类的内容写成JSON格式的字符串

C# 怎么将json 转换成 datatable

如何将 c# 二维数组转换为 JSON 对象?

将 json 转换为 C# 数组?

如何在不使用 C# 中的 T 对象的情况下将 Json 数组转换为单个 JSON 对象?