json解析

本文介绍了Unity3D中JSON的使用方法,包括JSON的基本结构、C#与JSON的对应关系,以及Unity官方库和LitJSON两种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.youkuaiyun.com/zys91011_muse/article/details/76282770

### JSON 数据解析方法 #### 1. Java 中解析 JSON 数据的方法 在 Java 开发中,常用的 JSON 解析方法包括使用 **Jackson**、**Gson** 和 **Fastjson** 等库来处理 JSON 数据。 - **Jackson** 是一个高性能的 JSON 解析库,支持将 JSON 字符串转换为 Java 对象,也可以将 Java 对象序列化为 JSON 字符串。使用 `ObjectMapper` 类可以实现 JSON解析与生成。 - **Gson** 是 Google 提供的一个用于解析和生成 JSON 的库,适用于 Java 对象与 JSON 数据之间的转换。它提供了 `fromJson()` 和 `toJson()` 方法来实现数据的转换。 - **Fastjson** 是阿里巴巴开发的一个高性能 JSON 库,支持将 JSON 字符串解析为 Java 对象,也可以将 Java 对象转换为 JSON 字符串。它提供了 `parseObject()` 和 `parseArray()` 方法来处理 JSON 数据[^1]。 #### 2. 前端解析 JSON 数据的方法 在前端开发中,JavaScript 提供了内置的 JSON 解析方法。 - 使用 `JSON.parse()` 方法可以将 JSON 字符串解析为 JavaScript 对象。例如,`const jsonObj = JSON.parse(jsonStr);`,其中 `jsonStr` 是一个 JSON 格式的字符串。 - 解析后的 JSON 对象可以像普通对象一样进行访问和操作。例如,可以通过 `jsonObj.length` 来获取数组长度,或者通过 `jsonObj.key` 来访问特定字段的值[^2]。 #### 3. JSON 语法与结构 JSON 数据由键值对组成,支持多种数据类型,包括字符串、数字、布尔值、对象、数组和 `null`。 - 示例 JSON 数据: ```json { "name": "zhangsan", "age": 28, "badperson": true, "child": { "name": "zhangxiaosan", "age": 8 }, "job": ["React", "JavaScript"], "wages": null } ``` 该 JSON 对象包含字符串、数字、布尔值、嵌套对象、数组和 `null` 值。在解析过程中,需要确保 JSON 数据格式正确,否则会导致解析失败[^3]。 ### JSON 数据解析常见问题 #### 1. JSON 格式错误 JSON 数据必须遵循严格的格式规范,否则会导致解析失败。常见的格式错误包括缺少逗号、引号不匹配、括号不闭合等。例如,字段名和字符串值必须使用双引号包裹,布尔值和 `null` 不需要引号。 - 错误示例: ```json { name: "zhangsan", age: 28 } // 字段名未使用双引号包裹 ``` - 正确示例: ```json { "name": "zhangsan", "age": 28 } ``` #### 2. 数据类型不匹配 在解析 JSON 数据时,如果目标对象的字段类型与 JSON 数据中的值类型不匹配,可能会导致解析错误或数据丢失。例如,JSON 数据中的数字值被解析为字符串类型,或者布尔值被解析为字符串。 - 解决方法:确保目标对象的字段类型与 JSON 数据中的值类型一致,或者在解析时进行类型转换。 #### 3. 嵌套结构处理不当 JSON 数据可能包含嵌套的对象或数组,处理嵌套结构时需要逐层解析。例如,解析嵌套对象时,需要先获取外层对象,再获取内层对象的字段。 - 示例代码(使用 Jackson 解析嵌套对象): ```java ObjectMapper objectMapper = new ObjectMapper(); String jsonStr = "{ \"name\": \"zhangsan\", \"child\": { \"name\": \"zhangxiaosan\", \"age\": 8 } }"; JsonNode jsonNode = objectMapper.readTree(jsonStr); String childName = jsonNode.get("child").get("name").asText(); // 获取嵌套对象中的字段值 ``` #### 4. 异常处理 在解析 JSON 数据时,可能会遇到异常情况,例如空指针异常、类型转换异常等。为了避免程序崩溃,需要添加异常处理逻辑。 - 示例代码(使用 Gson 解析 JSON 数据并处理异常): ```java try { String jsonStr = "{ \"name\": \"zhangsan\", \"age\": 28 }"; Person person = new Gson().fromJson(jsonStr, Person.class); } catch (JsonSyntaxException e) { System.out.println("JSON 解析失败: " + e.getMessage()); } ``` #### 5. 性能优化 在处理大量 JSON 数据时,解析性能可能会成为瓶颈。为了提高解析效率,可以选择高性能的 JSON 解析库,例如 Jackson 或 Fastjson。此外,避免在循环中频繁解析 JSON 数据,尽量将解析结果缓存起来以减少重复解析的开销。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值