Json解析

今天跟大家来讨论下关于json解析的一些事,

大家都知道unity3D游戏前端一般使用的开发语言都是c#,游戏开发的服务器端的开发语言就比较多了。

据我知道的有c++,JAVA,JavaScript(NodeJS),PHP,Python,Go,等开发语言。

那么这么多语言前端如何与后端进行交互呢?

这就要提到我们今天说的JSON。

JSON全名:JavaScript Object Notation 

                      JavaScript对象标记语言,是一种跨平台,跨语言,轻量级的数据交换格式。

对照关系
              通过C#的数据结构,映射到JSON语法描述
               命名注意大小写
        
        支持数据类型
            数字:short,int,long,float,double
            字符串:"abc","你好"
            布尔:true,false
            数组(链表):string[],List<T>()
            对象(字典):new Class,Dictionary<K, V>()
            null:null

结构简介

1对象            {"属性名":属性值}

2数组           [值1,值2,值3]

字符含义

{}:大括号表示对象,或是字典

[]:中括号表示数组list<>列表

::冒号表示赋值,等号,左侧为变量(键),右侧为值

,:逗号为元素分割符

“”:双引号为修饰变量,也表示String数据类型

‘’:单引号一般情况下同双引号

JSON与C#代码示例:

JSON(对象)

          {"Username" : "root", "Password" : "123"}

c#代码:

public class UserInfo {
					public string Username;
					public int Password;
				}
				
				UserInfo data = new UserInfo();
				data.Username = "root";
				data.Password = 123

                         其中username对象对应值“root”

                           Passward对象对应值123

JSON(数组)
                [1, 2, 3]
            C#代码
          

     List<int> data = new List<int>();
                data.Add(1);
                data.Add(2);
                data.Add(3);

            JSON(复合结构)
                [
                    {"ItemID" : 1, "Name" : "上海车牌", "Price" : 80000},
                    {"ItemID" : 2, "Name" : "北京车牌", "Price" : 0}
                ]
            C#代码

          class Item{
                    public int ItemID;
                    public string Name;
                    public int Price;
                    
                    public Item(int id, string name, int price) {
                        ItemID = id;
                        Name = name;
                        Price = price;
                    }
                }
                
                List<Item> data = new List<Item>();
                data.Add(new Item(1, "上海车牌", 80000));
                data.Add(new Item(2, "北京车牌", 0));

-----------------------------------------------------------------

关于JSON与C#的对应关系大致可以分为以上几种关系;

下面我们来说说JSON与C#的解析:

数据的使用
            如果想使用JSON中的数据,需要将JSON中的数据转化为当前语言可用的数据类型
            如果想将当前语言的数据,传输给别的语言,需要将当前语言的数据类型转化为JSON通用数据类型,再发送或存储
            序列化(编程语言数据对象 -> JSON字符串)
            反序列化(JSON字符串 -> 编程语言数据对象)

在unity开发中进行JSON数据解析一般有两种方法:

一、

使用unity官方的JSON解析类库

UnityEngine.JsonUtility

重点:经常容易忽略的是在使用UnityEngine.JsonUtility解析复杂JSON文件时特别是有对象数组时一定不要在创建对象数组前加

public class UserInfo {
    public string User;
    public int Age;
    public bool IsE;

    public List<ItemInfo> Package;
}

[System.Serializable]  //很容易忽略。
public class ItemInfo
{
    public int ID;
    public string Name;
}

public class UserInfo {
    public string User;
    public int Age;
    public bool IsE;

    public List<ItemInfo> Package;
}

[System.Serializable]
public class ItemInfo
{
    public int ID;
    public string Name;
}

public class TestJsonUtility : MonoBehaviour
{

    void Start()
    {
        TestJsonOverwrite();
    }

    public void TestUnserialize() {
        //JSON字符串
        string json = "{\"User\" : \"admin\", \"Age\" : 20, \"IsE\" : false";
        //JSON反序列化
        UserInfo data = JsonUtility.FromJson<UserInfo>(json);
        //获取数据
        Debug.Log(data.User);
    }

    public void TestSerialize() {
        //C#数据
        UserInfo data = new UserInfo();
        data.User = "root";
        data.Age = 30;
        data.IsE = true;

        //将数据序列化为JSON字符串
        string json = JsonUtility.ToJson(data);
        Debug.Log(json);
    }

    public void TestFileJsonUnserialize() {
        //StreamingAssets目录如何获得
        string path = Application.streamingAssetsPath + "/data.json";
        //读取文件内容
        string json = File.ReadAllText(path);
        //将JSON字符串反序列化
        UserInfo data = JsonUtility.FromJson<UserInfo>(json);
        //获取整个链表
        //var package = data.Package;
        List<ItemInfo> package = data.Package;

        Debug.Log(package[0].Name);
    }

    public void TestJsonOverwrite() {
        string json = File.ReadAllText(Application.streamingAssetsPath + "/data.json");

        //实例化UserInfo对象
        UserInfo data = new UserInfo();
        //使用JSON解析类,将data对象的值进行覆盖
        JsonUtility.FromJsonOverwrite(json, data);
        //打印出JSON中存储的值
        Debug.Log(data.User);
    }
}


                FromJson:JSON字符串反序列化为C#数据对象

  public void TestUnserialize() {
        //JSON字符串
        string json = "{\"User\" : \"admin\", \"Age\" : 20, \"IsE\" : false";
        //JSON反序列化
        UserInfo data = JsonUtility.FromJson<UserInfo>(json);
        //获取数据
        Debug.Log(data.User);
    }

Debug出来的数据为:admin
                FromJsonOverwrite:JSON字符串反序列化为C#数据对象

  public void TestJsonOverwrite() {
        string json = File.ReadAllText(Application.streamingAssetsPath + "/data.json");

        //实例化UserInfo对象
        UserInfo data = new UserInfo();
        //使用JSON解析类,将data对象的值进行覆盖
        JsonUtility.FromJsonOverwrite(json, data);
        //打印出JSON中存储的值
        Debug.Log(data.User);
    }

获取json文件中的字符串将其反序列化为c#的数据对象。

API:File.ReadAllText(Path)//获取路径为Path的文件内的所有字符串

            

     ToJson:C#数据对象序列化为JSON字符串

 public void TestSerialize() {
        //C#数据
        UserInfo data = new UserInfo();
        data.User = "root";
        data.Age = 30;
        data.IsE = true;

        //将数据序列化为JSON字符串
        string json = JsonUtility.ToJson(data);
        Debug.Log(json);
    }


          

二、使用LitJSON来解析JSON字符串

这是当前市面上大多数使用的方法

首先要去下一个litJSON的类库网上到处都是

然后将它复制到UNITY 工程中

然后要引用命名空间

using LitJson;

 

                 JsonMapper.ToObject()
                JsonMapper.ToObject<>()
                JsonMapper.ToJson()

关于这点我自认怎么写也不会比这位博主讲的更好了大家可以参靠https://blog.csdn.net/zys91011_muse/article/details/76282770

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值