【Unity数据交互】Json序列化你记得几分

2023-11-03 01:28

本文主要是介绍【Unity数据交互】Json序列化你记得几分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ˊˊ

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

🅰️



文章目录

    • 🅰️
    • 前言
    • 🎶(==1==)持久数据文件夹
    • 🎶(==2==)JsonUtlity进行序列化
      • 🪶<font color=red>0. jsonUtilty的注意点(缺点)
      • 🪶1.将对象序列化成字符串(Json格式)
      • 🪶2.将Json反序列化成对象
      • 🪶3.练习(将序列化和反序列化变成方法调用)
    • 🎶(==3==)LitJson进行序列化
      • 🪶1.如何使用
      • 🪶<font color=red>2. LitJson的注意点
      • 🪶3.序列化
      • 🪶4.反序列化
      • 🪶5.练习
    • 🎶(==4==)JsonUtility和LitJson的区别ˊ---
    • 🅰️


前言


🎶(1持久数据文件夹


在这里插入图片描述

  • 先获取文件夹的位置

print(Application.persistentDataPath);

  • 1.存储字符串到指定路径文件中

File.WriteAllText(Application.persistentDataPath + “/text.json”,“这是我创建的新json脚本” );

  • 2.在指定路径文件中读取字符串

string str = File.ReadAllText(Application.persistentDataPath + “/Test.json”);


🎶(2JsonUtlity进行序列化


JsonUtility是Unity引擎中的一个工具类,用于将JSON字符串转换为Unity对象或将Unity对象转换为JSON字符串。它可以方便地在Unity游戏中进行JSON数据的序列化和反序列化,使开发者可以更轻松地处理JSON数据。JsonUtility是一个非常强大和实用的工具,可以被广泛应用于Unity游戏中的数据管理、网络通信、游戏存档等方面。

  • 现实作用:
    1.将对象序列化成Json格式
    2.将Json格式反序列化为对象

在这里插入图片描述

  • 引用 using System.IO

IO通常是指Input/Output(输入/输出)的缩写。在计算机中,IO是指数据在计算机内部和外部设备之间的传输和交换。例如,键盘和鼠标输入数据到计算机中,打印机、屏幕和音箱从计算机中输出数据。这种数据的输入和输出过程就是IO。


🪶0. jsonUtilty的注意点(缺点)


😶‍🌫️注意:

    1.float序列化时看起来会有一些误差2.被包裹的自定义类需要加上序列化特性[System.Serializable]3.想要序列化私有变量 需要加上特性[SerializeField]4.JsonUtility不支持字典5.JsonUtlity存储null对象不会是null 而是默认值的数据,比如空int 会变成06.JsonUtility无法直接反序列化读取数据集合"[]",需要用一个对象包裹它7.文本编码格式需要时UTF-8 不然无法加载

在这里插入图片描述

在这里插入图片描述


🪶1.将对象序列化成字符串(Json格式)


  • string jsonStr = JsonUtility.ToJson( dataGame );

           // DataGame 是类对象
    
  • File.WriteAllText(Application.persistentDataPath + “/text1.json”, jsonStr);

         //将序列化后的字符串数据存在文件夹中
    

🪶2.将Json反序列化成对象


  • jsonStr = File.ReadAllText(Application.persistentDataPath + “/text1.json”);

       //读取文件中的字符串 
    
  • DataGame dataGame = JsonUtility.FromJson< DataGame >(jsonStr);

      //使用Json字符串内容 转换成类对象
    
  • 代码

 jsonStr  = File.ReadAllText(Application.persistentDataPath + "/text1.json");DataGame dataGame = JsonUtility.FromJson<DataGame >(jsonStr);

🪶3.练习(将序列化和反序列化变成方法调用)


using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;[System.Serializable]
public class Item
{public int id;public int num;public Item( int ID,int NUM){id = ID;num = NUM;}
}public class BossInfo
{public string name;public int attack;public int defence;public float moveSpeed;public double roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic1;public Dictionary<string, Item> itemDic2;[SerializeField ]private int self = 2 ;[SerializeField]protected int pro = 3;   //序列化public void serilized(BossInfo obj){if(obj!=null ){string onjInfo = JsonUtility.ToJson(obj);File.WriteAllText(Application.persistentDataPath + ("/BossInfo.json"), onjInfo);}}//反序列化public BossInfo  RevSerilized(string path){if (path != null){string objInfo = File.ReadAllText(Application.persistentDataPath +"/"+ path);return JsonUtility.FromJson<BossInfo>(objInfo);}else return null;} 
}public class text : MonoBehaviour
{private void Start(){BossInfo boss = new BossInfo();boss.name = "鸭嘴兽";boss.attack = 100;boss.defence = 20;boss.moveSpeed = 50;boss.roundSpeed = 30;boss.weapon = new Item(001, 10);boss.listInt = new List<int>() { 1, 2, 3, 4 };boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };boss.serilized(boss); //JsonUyility 不支持字典print(Application.persistentDataPath);boss.RevSerilized("BossInfo.json");}
}

🎶(3LitJson进行序列化


LitJson是一个用于C#和Unity的Json解析器和生成器。它可以将Json格式的数据解析为C#对象,也可以将C#对象序列化为Json格式的数据。它具有高效,易用和可扩展性的特点,在游戏开发、网站开发、物联网等领域广泛应用。

它是一个第三方库是第三方编写的(而UtilityJson是自己编写的),用于处理Json的序列化和反序列化,LitJson是C#编写的,体积小、速度快、易于使用

🪶1.如何使用


  • 在官网中跳转GitHub获取最新版本
    在这里插入图片描述
  • 将下好的版本中的C#脚本拖到Unity中
    在这里插入图片描述

🪶2. LitJson的注意点


  • 1.序列化不需要加特性
  • 2.不能序列化私有变量
  • 3.需要引用命名空间
  • 4.可以保存null值
  • 5.可以序列化字典,但是键必须是字符串类型否则会报错
  • 6.序列化类的时候一定要确保它有无参构造函数否则会报错
  • 7.可以直接读取数据集合[]
  • 8.文本编码格式需要时UTF-8 不然无法加载

🪶3.序列化


  • 和方式JsonUtility一样

  • string jsonStr = JsonMapper.ToJson(obj);

            // obj是类对象
    
  • File.WriteAllText(Application.persistentDataPath + “/text.json”, jsonStr);

            //将序列化后的字符串数据存在文件夹中
    

🪶4.反序列化


  • jsonStr = File.ReadAllText(Application.persistentDataPath + “/text.json”);

  • objInfo 2 = JsonMapper.ToObject< objInfo> (jsonStr);

       //通过泛型转换更方便
    
  • ②JsonData data = JsonMapper.ToObject(jsonStr);

       //JsonData是LitJson提供的类对象访问其中的内容要用键值对的形式去print(data["age"]);
    

🪶5.练习


using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class Item
{public int id;public int num;public Item() { } //因为有参把他替换了所以需要重新声明public Item( int ID,int NUM){id = ID;num = NUM;}
}public class BossInfo
{public string name;public int attack;public int defence;public float moveSpeed;public double roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic1;public Dictionary<string, Item> itemDic2;private int self = 2 ;protected int pro = 3;   //LitJson序列化public void LSerilized(BossInfo obj){if (obj != null){string objInfo = JsonMapper.ToJson(obj);File.WriteAllText(Application.persistentDataPath + ("/BossInfo2"), objInfo);}}//LitJson反序列化public BossInfo RevLSerilized(string path){if(path != null ){string objInfo =  File.ReadAllText(Application.persistentDataPath +"/"+path );return   JsonMapper.ToObject<BossInfo>(objInfo);}else   return null;}
}public class text : MonoBehaviour
{private void Start(){BossInfo boss = new BossInfo();boss.name = "鸭嘴兽";boss.attack = 100;boss.defence = 20;boss.moveSpeed = 50;boss.roundSpeed = 30;boss.weapon = new Item(001, 10);boss.listInt = new List<int>() { 1, 2, 3, 4 };boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };boss.LSerilized(boss); //JsonUyility 不支持字典print(Application.persistentDataPath);boss.RevLSerilized("BossInfo.json");}
}

🎶(4JsonUtility和LitJson的区别ˊ


  • 1.JsonUt1ity是Unity自带,LitJson是第三方需要引用命名空间
  • 2.JsonUt1ity使用时自定义类需要加特性,LitJson不需要
  • 3.JsonUt1ity支持私有变量(加特性),LitJson不支持
  • 4.JsonUt1ity不支持字典,LitJson支持(但是键只能是字符串)
  • 5.JsonUt1ity不能直接将数据反序列化为数据集合(数组字典),LitJson可以
  • 6.JsonUt1ity对自定义类不要求有无参构造,LitJson需要
  • 7.JsonUt1ity存储空对象时会存储默认值而不是nu11,LitJson会存null

🅰️


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


这篇关于【Unity数据交互】Json序列化你记得几分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/334610

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者