Unity Android uses JSON (LitJson)

Note:! ! ! The untiy packaged Android platform does not allow the use of Unity's own json tool Newtonsoft.Json.

LitJson does not support float type characters.

The formats supported by LitJson are as follows:

public JsonData(bool boolean);  
public JsonData(double number);  
public JsonData(int number);  
public JsonData(long number);
public JsonData(object obj) 
public JsonData(string str); 

You need to make LitJson support Float type:

    Just call the method in Awake or in the initialization coroutine.

/// <summary>
    /// LitJson data conversion can use Float
    /// </summary>
    private static void RegisterFloat()
    {         void Exporter(float obj, JsonWriter writer)         {             writer.Write(obj);         }



        JsonMapper.RegisterExporter((ExporterFunc<float>)Exporter);

        float Importer(double obj)
        {
            return (float)obj;
        }

        JsonMapper.RegisterImporter((ImporterFunc<double, float>)Importer);
    }

JSON conversion for Android, IOS, and PC (universal)

using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Networking;

public class JsonManager : SingleMono<JsonManager>
{
    public AllShengLingManagers allShengLing;  //生灵列表
    public string path; //Json存放路径
    void Start()
    {
        //初始化Json
        StartCoroutine(LoadSave("人族"));
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.V))
        {
            for (int i = 0; i < allShengLing.ShengLingList.Count; i++)
            {
                Debug.Log(allShengLing.ShengLingList[i].name);
            }
        }
      
    }
    /// <summary>
    /// 初始化人物操作
    /// </summary>
    /// <param name="name">种族名称</param>
    /// <returns></returns>
    public IEnumerator LoadSave(string name)
    {
        RegisterFloat();    //可使用Float类型数据
        path = Application.persistentDataPath +"/"+ "AllShengLing.json";       
        //allShengLing = new AllShengLingManagers();//初始化生灵
        //allShengLing.ShengLingList = new List<ShengLing>();  //初始化
        UnityWebRequest www = UnityWebRequest.Get("file://" + path);    //获取路径
        yield return www.SendWebRequest();  //发生请求
        if (www.result == UnityWebRequest.Result.Success)
        {
            var fileJson = www.downloadHandler.text;    //读取JSON文件
            Debug.Log(fileJson);
            Debug.Log($"数据存在---");
            StreamReader r = new StreamReader(path);    // 读
            string srRTE = r.ReadToEnd();
            Debug.Log("<color=#ff7f00>" + "Json配置文件内容:" + "</color>" + srRTE);
            allShengLing = JsonMapper.ToObject<AllShengLingManagers>(srRTE);    //反序列化生灵列表

            r.Close();  //关闭文本
            if (allShengLing == null)
            {
                Debug.Log("Json为空");
            }
            else //有数据的话,把各个种族的数据初始化
            {
                for (int i = 0; i < allShengLing.ShengLingList.Count; i++)
                {
                    if (CSVTest.instance.names.Contains(allShengLing.ShengLingList[i].name))  //判断名字是否相等,然后给到值,初始化
                    {
                        //某个UI等于该数据的数值
                    }
                }             
                //for (int i = 0; i < CSVTest.instance.names.Count; i++)  //查找names里面有没有这个名字
                //{
                //    if (CSVTest.instance.names[i].Equals(name)) //循环遍历列表里面的名字是不是叫name,是的情况下就加成并退出循环
                //    {
                //        allShengLing.ShengLingList[i].AllZhanLi += 10000;   //总战力+10000
                //        allShengLing.ShengLingList[i].AllSum += 10000;  //总人数+10000
                //        break;
                //    }
                //}                
            }
        }
        else
        {
            Debug.Log("没有该生灵的Json文件,正在生成该数据");
            //初始化生灵数据
            Init(name);
        }
    }
    /// <summary>
    /// 初始化生灵
    /// </summary>
    public void Init(string name)
    {
        ShengLing sl = new ShengLing();
        sl.name = name;
        sl.LeveL = 1;
        sl.QiangZhe = 0;
        sl.QiWu = 0;
        sl.MiFa = 0;
        sl.XieMai = 0;
        sl.AllSum = 10000;
        sl.AllZhanLi = 10000;
        allShengLing.ShengLingList.Add(sl);
        CSVTest.instance.names.Add("人族");
        GameManagers.instance.SaveRoleData(allShengLing, "AllShengLing.json");
    }
    /// <summary>
    /// LitJson数据转换,可使用Float
    /// </summary>
    public   void RegisterFloat()
    {
        void Exporter(float obj, JsonWriter writer)
        {
            writer.Write(obj);
        }

        JsonMapper.RegisterExporter((ExporterFunc<float>)Exporter);

        float Importer(double obj)
        {
            return (float)obj;
        }

        JsonMapper.RegisterImporter((ImporterFunc<double, float>)Importer);
    }
    /// <summary>
    /// 删除对象
    /// </summary>
    /// <param name="name">要删除的名字</param>
    public void RemoveShuJu(string name)
    {
        for (int i = 0; i < allShengLing.ShengLingList.Count; i++)
        {
            var item = allShengLing.ShengLingList[i];   //要删除的对象
            if (item.name.Equals(name))
            {
                allShengLing.ShengLingList.Remove(item);
                GameManagers.instance.SaveRoleData(allShengLing, "AllShengLing.json");
            }
        }
       
    }

}

Save the JSON script display and put it into a singleton script for easy calling


    /// <summary>
    /// Json保存
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <param name="data">对象</param>
    public void SaveRoleData<T>(T data,string name)
    {
        Debug.Log("数据保存");
        string path = Application.persistentDataPath + "/"+ name;
        string saveJsonStr = JsonMapper.ToJson(data);   //序列化JSON文件,写入Json
        File.WriteAllText(path, saveJsonStr);

    }

Guess you like

Origin blog.csdn.net/m0_71624363/article/details/132609569