Unity之Json读取写入

一、Json简介

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,主要用于传送数据。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

一般用于数据交互,服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)

二、Json数据组成

Json一般分为int、bool、string、Double、数组五种。其中数组可以直接用[0,1,2,3]方式表示,数组中也可以包含json嵌套。

{
  "IntValue":123,
  "BoolValue":true,
  "StringValue": "这是String类型值,必须要用引号",
  "DoubleValue": 123.456,
  "ArrayDouble": [ 0, 338, 115 ],

  "ArrayString": [
    {
      "ArrayName": "这是数组类型的json格式",
      "ArrayDouble": 7.89
    },
    {
      "ArrayName": "这是数组类型的json格式2",
      "ArrayDouble": 1.23
    }
  ]
}

手动写的Json可以用下面的解析工具测试对错 

JSON在线 | JSON解析格式化—SO JSON在线工具

Unity之Json读取写入_第1张图片

Unity之Json读取写入_第2张图片

三、Json控制器

用于读取、保存json数据,其中还包含了json数据类用于转换。

using System.IO;
using UnityEngine;
using System;


[Serializable] //一定要序列化
public class JsonBaseData
{
    public int IntValue;
    public bool BoolValue;
    public string StringValue;
    public double DoubleValue;
    public double[] ArrayDouble;//数值数组
    public ArrayString[] ArrayString;//json嵌套数组
}

[Serializable] //一定要序列化
public class ArrayString
{
    public string ArrayName;
    public double ArrayDouble;
}

public class JsonController
{
    #region 获取Json数据文件

    public string GetTextForStreamingAssets(string fileName)
    {
        string jsonPath;
        if (Application.platform == RuntimePlatform.Android)
            jsonPath = Application.persistentDataPath + "/" + fileName;
        else
            jsonPath = Application.streamingAssetsPath + "/" + fileName;

        string data = File.ReadAllText(jsonPath);
        //Debug.Log("获取Json数据文件: " + data);
        return data;
    }

    #endregion

    #region 存储json数据
    /// 
    /// 存储json数据
    /// 
    /// json数据类
    /// json文件名称
    public void SaveJsonData(object jsonData, string fileName)
    {
        string jsonPath;

        if (Application.platform == RuntimePlatform.Android)
            jsonPath = Application.persistentDataPath + "/" + fileName; //安卓存储
        else
            jsonPath = Application.streamingAssetsPath + "/" + fileName; //pc存储

        if (File.Exists(jsonPath))
        {
            byte[] byteData = System.Text.Encoding.Default.GetBytes(JsonUtility.ToJson(jsonData, true));
            File.WriteAllBytes(jsonPath, byteData);
        }
    }
    #endregion

}

四、Json使用方式

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonTest : MonoBehaviour
{
    string value;
    JsonBaseData data;
    JsonController jsonController;
    void Start()
    {
        jsonController = new JsonController();
        //Debug.Log("读取的Json字符串:"+jsonController.GetTextForStreamingAssets("Config.json"));
        data = JsonUtility.FromJson(jsonController.GetTextForStreamingAssets("Config.json"));

        Debug.Log("IntValue: " + data.IntValue);
        Debug.Log("BoolValue: " + data.BoolValue);
        Debug.Log("StringValue: " + data.StringValue);
        Debug.Log("DoubleValue: " + data.DoubleValue);

        #region 输出ArrayDouble

        value = "[";
        for (int i = 0; i < data.ArrayDouble.Length; i++)
        {
            if (i == 0)
                value += $"{data.ArrayDouble[i]}";
            else
                value += $",{data.ArrayDouble[i]}";

        }
        Debug.Log("ArrayDouble: " + value + "]");

        #endregion

        #region 输出ArrayString
        value = "";
        for (int i = 0; i < data.ArrayString.Length; i++)
        {
            if (i == 0)
            {
                value += $"[\"ArrayName\":{data.ArrayString[i].ArrayName}," +
                    $"\"ArrayDouble\":{data.ArrayString[i].ArrayDouble}]";
            }
            else
            {
                value += $",[\"ArrayName\":{data.ArrayString[i].ArrayName}," +
                    $"\"ArrayDouble\":{data.ArrayString[i].ArrayDouble}]";
            }
        }

        Debug.Log("ArrayString: " + value);

        #endregion

    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            data.StringValue = "修改保存后的json值";
            jsonController.SaveJsonData(data, "Config.json");

        }
    }
}

五、动态Json字段属性转换 

如果我们的Json字段属性是动态添加的不是固定长度可以使用using Newtonsoft.Json.Linq;中的JObject属性。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json.Linq;

public class JsonTest2 : MonoBehaviour
{
    string jsonStr="{}";
    JsonController jsonController;

    void Start()
    {
        #region 数组转换
        //jsonStr = "{\"数组1\":[0,1,2],\"数组2\":[0,1,2]}";
        //JObject data = JObject.Parse(jsonStr);
        //Debug.Log(data["数组1"]); //1.直接打印
        //JArray itemsArray = (JArray)data["数组1"];//2.转换数组
        //Debug.Log(itemsArray.Count); 

        #endregion

        #region 数组Json转换
        //jsonStr = "{\"数组\":[{\"数据0\":\"000\",\"数据1\":\"111\"},{\"数据2\":\"222\",\"数据3\":\"333\"}]}";
        //Debug.Log(jsonStr);
        //JObject data = JObject.Parse(jsonStr);
        //Debug.Log(data["数组"]); //1.直接打印
        #endregion


        //动态数据加载
        ADDJson();
    }

    void Update()
    {
        
    }
    int jsonNumber = 0;

    void ADDJson() 
    {
        string str= jsonStr.Substring(0, jsonStr.Length- 1);
        if (jsonNumber==0) 
            str += $"\"{jsonNumber}\":\"数据{jsonNumber}\""; 
        else
            str += $",\"{jsonNumber}\":\"数据{jsonNumber}\"";

        str += "}";

        jsonStr = str;

        jsonNumber++;

        JsonConvert();

    }

    void JsonConvert() 
    {
        if (jsonController==null)
            jsonController = new JsonController();

        JObject data = JObject.Parse(jsonStr);

        IEnumerable properties = data.Properties();
        foreach (JProperty item in properties)
        {
            Debug.Log($"{item.Name}:{item.Value}");
            // item.Name 为 键
            // item.Value 为 值
        }
        //JArray itemsArray = (JArray)data["0"];//数组转换

        //2秒后执行
        Invoke("ADDJson",2f);
    }
}

六、注意事项

1.Json文件编码一定要是UTF-8

Unity之Json读取写入_第3张图片

Unity之Json读取写入_第4张图片

 修改方式直接文件另存为修改为UTF-8即可

Unity之Json读取写入_第5张图片

Unity之Json读取写入_第6张图片

2.Json书写格式注意

Unity之Json读取写入_第7张图片

Unity之Json读取写入_第8张图片

Unity之Json读取写入_第9张图片

Unity之Json读取写入_第10张图片

Unity之Json读取写入_第11张图片

3.Json转换类时字段名称要一致

Unity之Json读取写入_第12张图片

4.转换Json的类一定要序列化

未序列化的类无法进行转换 

Unity之Json读取写入_第13张图片

你可能感兴趣的:(unity,json,游戏引擎)