一、什么是 Json
1.JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation)
2.JSON 是輕量級的文本數(shù)據(jù)交換格式
3.JSON 獨(dú)立于語言:JSON 使用 Javascript語法來描述數(shù)據(jù)對象,但是 JSON 仍然獨(dú)立于語言和平臺。JSON 解析器和 JSON 庫支持許多不同的編程語言。 目前非常多的動(dòng)態(tài)(PHP,JSP,.NET)編程語言都支持JSON。
4.JSON 具有自我描述性,更易理解
二、Json 格式
{} 表示對象
[] 表示數(shù)據(jù)
, 表示分割數(shù)據(jù)
: 表示鍵值對
每個(gè)鍵值對都代表一條數(shù)據(jù),每條數(shù)據(jù)都是以","隔開的
三、Json 對象
結(jié)構(gòu):
{
key1:value1,
key2:value2,
key3:value3……
}
1.面向?qū)ο螅簁ey對應(yīng)的是對象的變量,值對應(yīng)的是變量的值
{
"name":"AIVSR",
"age":18
}
2.復(fù)雜對象:
對象內(nèi)包含對象:
{
"name":"AIVSR",
"child": { "name"="c_AIVSR" }
}
對象內(nèi)包含數(shù)組:
{
"name":"AIVSR",
"house":["二環(huán)",”三環(huán)“,”四環(huán)“]
}
對象內(nèi)包含數(shù)組,數(shù)組是一個(gè)對象數(shù)組:
{
"name":"AIVSR",
"house":[{
"name":"h1",
"add":"二環(huán)"
},
{
"name":"h2"
"add":"三環(huán)"
}]
}
四 、C# 關(guān)于Json的操作(簡單對象形式)
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
#region 模塊信息
/*----------------------------------------------------------------
// 模塊名:JsonTool
// 創(chuàng)建者:AIVSR
// 創(chuàng)建日期:
// 修改者列表:
// 模塊描述:MyFramework 關(guān)于Json的操作
//----------------------------------------------------------------*/
#endregion
public class JsonTools : MonoBehaviour
{
/// <summary>
/// 創(chuàng)建簡單列Json
/// </summary>
/// <param name="folder"></param>
/// <param name="name"></param>
/// <param name="listJson"></param>
public static void Create(string folder, string name, List<Dictionary<string, string>> listJson, bool isCovered = false)
{
string localPath = ProjectBasicInformation.PlatformPath + folder + "/" + name + ".json";
if (!File.Exists(localPath))
{
JObject jObject = new JObject();
foreach (var jsonDirItem in listJson)
{
foreach (var jsonItem in jsonDirItem)
{
jObject[jsonItem.Key] = jsonItem.Value.ToString();
}
}
string json = jObject.ToString();
if (isCovered)
File.WriteAllText(localPath, json);
}
#if UNITY_EDITOR
AssetDatabase.Refresh();
#endif
}
/// <summary>
/// 追加Json
/// </summary>
/// <param name="folder"></param>
/// <param name="name"></param>
/// <param name="listJson"></param>
public static void Add(string folder, string name, List<Dictionary<string, string>> listJson)
{
string localPath = Application.streamingAssetsPath + "/" + folder + "/" + name + ".json";
var content = File.ReadAllText(localPath);
JObject jObject = new JObject();
JObject localJObject = JObject.Parse(content);
foreach (var jsonDir in listJson)
{
foreach (var jsonItem in jsonDir)
{
localJObject.Add(jsonItem.Key, jObject[jsonItem.Key] = jsonItem.Value.ToString());
}
}
if (!File.Exists(localPath))
{
FileStream fileStream = new FileStream(localPath, FileMode.Create, FileAccess.ReadWrite);
fileStream.Close();
}
File.WriteAllText(localPath, localJObject.ToString());
}
/// <summary>
/// 讀取json
/// </summary>
/// <param name="folder"></param>
/// <param name="name"></param>
/// <returns></returns>
public static List<Dictionary<string, string>> ReadFile(string folder, string name)
{
string localPath = ProjectBasicInformation.PlatformPath + folder + "/" + name + ".json";
List<Dictionary<string, string>> listJsonDictionary = new List<Dictionary<string, string>>();
if (!File.Exists(localPath))
{
using (StreamReader file = File.OpenText(localPath))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject jObject = (JObject)JToken.ReadFrom(reader);
foreach (var jsonitem in jObject)
{
Dictionary<string, string> readJsonDictionary = new Dictionary<string, string>();
readJsonDictionary.Add(jsonitem.Key, jsonitem.Value.ToString());
Debug.Log(jsonitem);
listJsonDictionary.Add(readJsonDictionary);
}
}
}
}
return listJsonDictionary;
}
/// <summary>
/// 讀取json文件中的某個(gè)已知Key值
/// </summary>
/// <param name="folder"></param>
/// <param name="name"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string ReadKey(string folder, string name, string key)
{
string localPath = ProjectBasicInformation.PlatformPath + folder + "/" + name + ".json";
string jTokenString = "";
if (File.Exists(localPath))
{
using (StreamReader file = File.OpenText(localPath))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject jObject = (JObject)JToken.ReadFrom(reader);
JToken jToken = jObject[key]; //獲取Key的值
jTokenString = jToken.ToString();
}
file.Close();
file.Dispose();
}
}
return jTokenString;
}
/// <summary>
/// 更新Json
/// </summary>
/// <param name="folder"></param>
/// <param name="name"></param>
/// <param name="key"></param>
/// <param name="newValue"></param>
public static void Updata(string folder, string name, string key, string newValue)
{
string localPath = Application.streamingAssetsPath + "/" + folder + "/" + name + ".json";
using (StreamReader file = File.OpenText(localPath))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject jObject = (JObject)JToken.ReadFrom(reader);
JToken jToken = jObject[key]; //獲取Key的值
string jTokenString = jToken.ToString();
if (newValue != jTokenString)
{
jObject[key] = newValue;
}
file.Close();
file.Dispose();
if (!File.Exists(localPath))
{
FileStream fileStream = new FileStream(localPath, FileMode.Create, FileAccess.ReadWrite);
fileStream.Close();
}
File.WriteAllText(localPath, jObject.ToString());
}
}
}
/// <summary>
/// 刪除Json節(jié)點(diǎn)
/// </summary>
/// <param name="folder"></param>
/// <param name="name"></param>
/// <param name="key"></param>
public static void Delete(string folder, string name, string key)
{
string localPath = Application.streamingAssetsPath + "/" + folder + "/" + name + ".json";
using (StreamReader file = File.OpenText(localPath))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject jObject = (JObject)JToken.ReadFrom(reader);
if (jObject[key] != null)
{
jObject.Remove(key);
}
file.Close();
file.Dispose();
if (!File.Exists(localPath))
{
FileStream fileStream = new FileStream(localPath, FileMode.Create, FileAccess.ReadWrite);
fileStream.Close();
}
File.WriteAllText(localPath, jObject.ToString());
}
}
}
}
五、常見報(bào)錯(cuò)處理:
1、檢查花括號,中括號是否能對應(yīng)上
2、檢查你的Json中符號是否都是半角符號,英文符號
3、你的int類型值如果是1,不能寫成01的形式
4、檢查一些應(yīng)該標(biāo)識序列化特性的地方
注:
1.特性“[]”
[System.Serializable]:修飾類上,證明該類是可以被序列化和反序列化的
2.序列化和反序列化
序列化:把對象轉(zhuǎn)換成字節(jié)序列的過程稱為對象的序列化
反序列化:把字節(jié)序列轉(zhuǎn)換成對象的過程稱為對象的反序列化