一、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在线工具
三、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数据
/// <summary>
/// 存储json数据
/// </summary>
/// <param name="jsonData">json数据类</param>
/// <param name="fileName">json文件名称</param>
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<JsonBaseData>(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<JProperty> 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
修改方式直接文件另存为修改为UTF-8即可
2.Json书写格式注意
3.Json转换类时字段名称要一致
4.转换Json的类一定要序列化
未序列化的类无法进行转换