JSON 教程

一、什么是 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)換成對象的過程稱為對象的反序列化
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容