直接上代码的比较好 保存的是100个玩家数据playerdata,每个playerdata里面又有玩家的id,password,coins
尤其注意 [Serializable] 博主很菜,不知道为什么要用,反正要用,不用就错。
现在知道了
JsonUtility也是有局限性的:
1.无法直接序列化和反序列化List<T>和Dictionary<TKey,TValue>
2.3.0自动属性也无法序列和反序列化
实际上List<T>是支持的,只是无法直接的对List<T>对象进行序列化和反序列化,需要将List<T>包装(Wrap)到一个类当中,然后序列化和反序列化包含这个List<T>的对象即可
Dictionary是确实不支持的,这在官方的文档中也有说明
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class TestJson : MonoBehaviour
{
string jsonpath;
// Use this for initialization
void Start()
{
jsonpath = Application.streamingAssetsPath + "/jsontest.json";
WriteJson();
StartCoroutine(ReadJson());
}
/// <summary>
/// 写json
/// </summary>
public void WriteJson()
{
if (!File.Exists(jsonpath))
{
File.Create(jsonpath);
}
Jsondata jsondata = new Jsondata();
jsondata.myplayerdata = new List<PlayerData>();
for (int i = 0; i < 100; i++)
{
PlayerData playdata = new PlayerData();
playdata.id = i;
playdata.password = i.ToString();
playdata.coins = i + 100;
jsondata.myplayerdata.Add(playdata);
}
string json = JsonUtility.ToJson(jsondata, true);
File.WriteAllText(jsonpath, json);
}
/// <summary>
/// 读json
/// </summary>
/// <returns></returns>
IEnumerator ReadJson()
{
yield return new WaitForSeconds(3);
string json = File.ReadAllText(jsonpath);
Jsondata jsondata = new Jsondata();
jsondata = JsonUtility.FromJson<Jsondata>(json);
print(jsondata.myplayerdata.Count);
for (int i = 0; i < jsondata.myplayerdata.Count; i++)
{
print(jsondata.myplayerdata[i].id);
print(jsondata.myplayerdata[i].password);
print(jsondata.myplayerdata[i].coins);
}
}
// Update is called once per frame
void Update()
{
}
}
[Serializable]
public class PlayerData
{
public int id;
public string password;
public float coins;
}
public class Jsondata
{
public List<PlayerData> myplayerdata;
}