Unity的Json解析<二>–写Json文件

本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.youkuaiyun.com/cartzhang/article/details/50378805
作者:cartzhang

Unity的Json解析<二>–写Json文件

上篇做了对Json格式文件读操作,
链接地址:http://blog.youkuaiyun.com/cartzhang/article/details/50373558

本章对Json的写文件,做个处理.
写文件也非常简单,把大象装冰箱一样,分三步,
创建文件,
把内容写入文件,
然后关闭文件.

内容

我们要处理的是所写的内容,我们打算写什么都Json文件中呢?
我们打算把昨天的格式继续利用,还记得GameStatus ,这个是我修改的.不过,还算好用啊.
GameStatus.cs文件代码如下:

using UnityEngine;
using System;
using System.Collections;

[Serializable]
public class GameStatus
{
    public string gameName;
    public string version;
    public bool isStereo;
    public bool isUseHardWare;
    public refencenes[] statusList;
}

[Serializable]
public class refencenes
{
    public refencenes()
    {
        name = "";
        id = -1;
    }

    public string name;
    public int id;
}

写Json格式

写JSon格式呢,我看网上都用的BinaryFormatter来处理,但是我发现这个跟昨天的问题类型,要是用BinaryFormatter的话,等保存好的Json文本打开后,各种空格,NULL和乱码.这个主要是编码格式的问题.
所以,我拒绝使用它了.

我使用File,直接WriteALLText来处理.

代码如下:

    public void SaveJson()
    {
        string json = JsonUtility.ToJson(gameStatus);
        string savePath = Application.dataPath + "/Resources/Test01.json";
        File.WriteAllText(savePath, json, Encoding.UTF8);        

        Debug.Log("save:::" + savePath);
    }

这样就完成了写文件是否很简便呢??!!!

写Json的完整代码

完整代码如下:

using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;

public class WriteJson : MonoBehaviour
{
    public GameStatus gameStatus;
    public GameObject[] objects;
    void Start()
    {
        gameStatus = new GameStatus();
        gameStatus.statusList = new refencenes[objects.Length];
        gameStatus.gameName = "JSON Write Test";

        for (int i = 0; i < objects.Length; i++)
        {
            gameStatus.statusList[i] = new refencenes(); 
            gameStatus.statusList[i].id = i;
            gameStatus.statusList[i].name = objects[i].name;
        }
    }

    public void SaveJson()
    {
        string json = JsonUtility.ToJson(gameStatus);
        string savePath = Application.dataPath + "/Resources/Test01.json";
        File.WriteAllText(savePath, json, Encoding.UTF8);        

        Debug.Log("save:::" + savePath);
    }
}

怎么使用?

我建立了一个测试工程.
只能如图了:
Json读

你依然可以看到昨天写文件的痕迹.

当然我们只关注写Json了.

在writeJson的属性面板上,可看到,给它的Objects拖拽了一个cube,一个Capsule,作为保存到JSon文件中的内容的一部分.

然后在运行Unity 编辑器时,按下”S”,保存键,就会在当前工程下的\Assets\Resources\中,产生了一个Test01.json的文件,这个代码中可以看到的,你可随意修改.

结果

让我们来看看我们都保持都Json文件中了什么东西.

{"gameName":"JSON Write Test","version":"","isStereo":true,"isUseHardWare":false,"statusList":[{"name":"Cube","id":0},{"name":"Capsule","id":1}]}

这就是你所保存的Json文件中的内容.


我打算上传都github,但是现在我github一直让更新,更新不成功,打不开啊!

留下地方吧!!

github一大早来更新,终于更新成功。
**
所以,源码地址:https://github.com/cartzhang/UnityJsonTest

快捷到达源码:Unity Json Test for 5.3

**

至此,Json文件的读写都搞定了.

更多

关于Json文件的使用,我打算尝试一个,能不能做个更好的配置,比如控制游戏的场景配置和游戏流程.打包后面不用修改,直接修改json 就可以创建一个完全不一样的游戏了.
这样,是不是比较蠢呢!!可能会,比较复杂吧!!
只个想法,若有兴趣,看看能不能实现一下.

———THE—–END————————–
若有问题,请随时联系!!
非常感谢!!!

<think>我们正在讨论Unity中使用JsonUtility.FromJson方法将JSON字符串转换为对象。用户现在询问的是关于JsonMapper.ToObject<HomelistReturn>()方法返回值的数据类型。注意:用户提到的“json.ToObject<HomelistReturn>()”实际上可能指的是第三方库(如LitJson)中的JsonMapper.ToObject方法,因为Unity自带的JsonUtility并没有ToObject这样的方法名。根据引用[5]中的代码片段,我们可以看到使用了`JsonDatadata=JsonMapper.ToObject(request.downloadHandler.text);`,这里使用的是LitJson库。因此,我们需要明确:1.如果用户使用的是Unity自带的JsonUtility,那么对应的方法是`JsonUtility.FromJson<HomelistReturn>(jsonString)`,其返回值类型就是泛型参数指定的类型`HomelistReturn`。2.如果用户使用的是LitJson库(常见于Unity中处理JSON),那么`JsonMapper.ToObject<HomelistReturn>(jsonString)`的返回值类型也是`HomelistReturn`。但是,在引用[5]中,代码使用的是`JsonMapper.ToObject`(没有指定泛型),返回的是`JsonData`类型(LitJson库中的一个通用类型,可以表示任何JSON数据)。而如果指定了泛型,则返回该泛型类型的对象。所以,对于用户的问题:`json.ToObject<HomelistReturn>()`的返回值类型,答案就是`HomelistReturn`。但要注意,用户的方法名的是`json.ToObject`,这可能是某个封装后的方法,但根据上下文,我们推测用户指的是LitJson库中的`JsonMapper.ToObject<T>()`方法。因此,回答如下:当使用LitJson库的JsonMapper.ToObject<HomelistReturn>(jsonString)方法时,返回值类型为HomelistReturn。如果转换成功,则返回一个HomelistReturn类型的对象;如果转换失败,则可能抛出异常或返回null(具体看库的实现和错误处理)。同时,提醒用户注意:1.需要确保HomelistReturn类的结构与JSON字符串匹配。2.需要处理可能的异常情况(如JSON格式错误、类型不匹配等)。生成相关问题:1.如何定义HomelistReturn类以匹配JSON结构?2.使用JsonMapper.ToObject方法时如何处理异常?3.LitJson库和Unity自带的JsonUtility在性能上有何差异?4.在Unity中还有哪些常用的JSON处理库?</think>在 Unity 中,`JsonMapper.ToObject<HomelistReturn>()` 的**返回值类型是泛型参数指定的 `HomelistReturn` 类型**。这意味着该方法会将 JSON 字符串反序列化为一个具体的 `HomelistReturn` 类实例。 ### 关键说明: 1. **返回值类型** - 直接返回 `HomelistReturn` 类型的对象,例如: ```csharp HomelistReturn result = JsonMapper.ToObject<HomelistReturn>(jsonString); ``` - 如果 JSON 数据无法匹配 `HomelistReturn` 的结构,可能返回 `null` 或抛出异常。 2. **依赖条件** - 需要正确定义 `HomelistReturn` 类,其字段/属性必须与 JSON 键名**严格匹配**(包括大小)。 - 示例类结构: ```csharp [System.Serializable] public class HomelistReturn { public int status; public string message; public List<Item> data; // 嵌套类也需定义 } ``` 3. **错误处理** - **空值检查**:建议在使用前验证返回值: ```csharp if (result != null) { /* 处理数据 */ } ``` - **异常捕获**:反序列化失败时可能抛出异常: ```csharp try { var result = JsonMapper.ToObject<HomelistReturn>(json); } catch (Exception e) { Debug.LogError($"解析失败: {e.Message}"); } ``` ### 对比 Unity 原生方法 - Unity 自带 `JsonUtility.FromJson<T>()` 的行为与 `JsonMapper.ToObject<T>()` 类似,均返回泛型类型 `T` 的对象[^1][^2]。 - 区别在于 `JsonMapper` 属于第三方库 **LitJson**,需手动导入到项目中,而 `JsonUtility` 是 Unity 原生 API。 ### 使用场景示例 ```csharp // 从网络请求获取 JSON UnityWebRequest request = UnityWebRequest.Get(url); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { string json = request.downloadHandler.text; // 反序列化为具体类型 HomelistReturn data = JsonMapper.ToObject<HomelistReturn>(json); if (data != null) { Debug.Log($"状态码: {data.status}, 数据量: {data.data.Count}"); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值