unity3d 我不能用C#写json文件

ktecyv1j  于 2022-11-16  发布在  C#
关注(0)|答案(3)|浏览(163)

我只是想在json文件中保存一个数组,但我不知道怎么回事,在dataUser.json中只有“{}”

//test.cs
void Start() { Test(); }
void Test()
{
    string[,] dataUser = new string[,] 
    {
        {"NgocPhat", "03"},
        {"PhatNgoc", "02"}
    };
    string json = JsonUtility.ToJson(dataUser, true);
    File.WriteAllText(Application.dataPath + "/dataUser.json", json);    
}

输出量

//dataJson.json
{}

//https://i.stack.imgur.com/SRDHJ.png
piok6c0g

piok6c0g1#

根据Unity文档here,以下摘录描述了您的问题:
在内部,此方法使用Unity序列化程序;因此序列化程序必须支持传入的对象:它必须是应用了Serializable属性的MonoBehaviour、ScriptableObject或普通类/结构。
这以一种微妙的方式告诉我们,某些.Net可识别的对象不能被Unity序列化程序识别。这可以在Unity检查器中看到,例如,如果你试图向MonoBehaviour添加一个string[,]字段,你在检查器中看不到它。
请注意,无论您如何装饰string[,]Dictionary<Tk, Tv>,您都无法对其进行序列化。根据经验,如果您在检查器中看不到它,则无法对其进行序列化。
UnityJsonUtility序列化器的限制性也更强一些。你不能序列化(反序列化)单个对象。它只能序列化(反序列化)一个类或结构。
这样看来,您似乎是JSON格式的负责人,因此考虑到这一点,您可能需要执行以下操作:
第一个
结果应如下所示:

{
    "users": [
        {
            "name": "NgocPhat",
            "code": "03"
        },
        {
            "name": "PhatNgoc",
            "code": "02"
        }
    ]
}
cetgtptt

cetgtptt2#

从某人的评论中链接的文档可能指出了这个问题:
“在内部,此方法使用Unity序列化程序;因此序列化程序必须支持传入的对象:它必须是应用了Serializable属性的MonoBehaviour、ScriptableObject或普通类/结构。”
我的猜测是数组基类没有这个属性?我认为数组类型的属性可以被序列化,但可能不是你现在这样做的。
我猜解决方案是创建一个伪类来进行序列化,如下所示:

public class Dummy
{
    [Serializable]
    public string[,] Data { get; set; }
}

string[,] dataUser = new string[,] 
{
    {"NgocPhat", "03"},
    {"PhatNgoc", "02"}
};
string json = JsonUtility.ToJson(new Dummy { Data = dataUser }, true);

仅供参考,它将数组嵌套在JSON的Data属性中。
您也可以尝试使用Newtonsoft.JSON之类的代码,它可能会对您的原始代码更宽容一些。

nqwrtyyt

nqwrtyyt3#

不确定这是否准确回答了你的问题。但是我已经使用json de & / serializing有一段时间了,它用这个方法工作得很好!
因此,首先您需要将内容保存/写入json文件(本例中为列表)。

JsonSerializer serializer = new JsonSerializer();
                serializer.Converters.Add(new JavaScriptDateTimeConverter());
                serializer.NullValueHandling = NullValueHandling.Ignore;

                using (StreamWriter sw = new StreamWriter(@"YOURPATH"))
                using (JsonWriter writer = new JsonTextWriter(sw))
                {
                    serializer.Serialize(writer, loaned); //loaned is the name of the list.
                }

把它放在函数保存()中,然后调用它或任何你想用的方法。
然后如果你想读取json文件中的信息,//加载数据。

JsonSerializer serializer = new JsonSerializer();
                serializer.Converters.Add(new JavaScriptDateTimeConverter());
                serializer.NullValueHandling = NullValueHandling.Ignore;

                using (StreamReader file = File.OpenText(@"YOURPATH"))
                {
                    loaned = JsonConvert.DeserializeObject<List<Bok>>(File.ReadAllText(@"YOURPATH"));
                    serializer = new JsonSerializer();
                    loaned = (List<Bok>)serializer.Deserialize(file, typeof(List<Bok>)); //loaned = the list, and then the type list, and the class/object "Bok"
                }

免责声明:我不是一个Maven,我相信有更多的效果方法,但这一个工程刚刚好!

相关问题