报告错误的argument exception : jsonmustrepresentanobjecttype。
错误的截图
误译ArgumentException:JSON必须表示对象类型。
问题分析Step 1使用正确的json规范定位问题
判断对JsonUtility.FromJson()的理解不足是错误的原因。
我在Scripting API上找这个方法
比较代码时,我使用的JsonUtility.FromJson()返回List数组,方法签名指示返回的类型必须是对象。
发出我的“错误”. json文件
错误演示[ { 'panelType': 'ItemMessage ',' path ' : ' ui panel/itemmessagepanel ' }, { ' panel type ' 3360 ' kna nel ] ' path ' : ' ui panel/knapsack panel '、{ 'panelType': 'MainMenu '、' path ' 33660 } ShopPanel' }、{ 'panelType': 'Skill '、' path ' : ' ui panel/skill panel ' }、{ ' path ' 3360 ' ui panel/skill path ' 3360 } ' path ' : ' ui面板/系统面板' }、{ 'panelType': 'Task '、' path ' : ' ui面板/task panel }
3359 blog.csdn.net/Yanqing _ happy/article/details/98871448
在此提取要使用的部分
----JSON语法规则-----
数据位于名称/值对中
数据用逗号分隔
大括号保存对象
大括号保存数组
所以首先,必须将json语法修改为用大括号而不是数组保存的对象!
修改后的json代码如下
{ ' infolist ' : [ { ' paneltypestring ' : ' item message ',' path ' 3360 ' ui panel/itemmmessagepanel ' },{ ' pantant } ' path ' : ' ui面板/knapsack面板'、{ ' paneltypestring ' : ' main menu '、' path ' : ' ui面板/main menu面板{ 'panelTypeString': 'Skill '、' path ' : ' ui面板/skill面板' }、' path ' : ' ui面板/system面板' }
Step 2支持使用包类的JsonUtility序列化的List、Array和Dictionary的最佳方法是使用包类
[ system.serializable ] publicclassuipanelinfo { publicuipaneltypepaneltype; 公共字符串路径; publicstaticuipaneltypejsoncreatefromjson (stringjsonstring ) (returnjsonutility.fromjsonuipaneltypejson ) (JSON字符串) } publicclassuipaneltypejson//uipanelinfo的包装类具有[System.Serializable]特性{ public ListUIPanelInfo infoList; }如果您想了解更多关于序列化使用包装的信息,请查看本博客的文章
3359 blog.csdn.net/oyji 1992/article/details/74505230
至此,json文件和包类操作已完成。 可以在UIPanelTypeJson类中生成的实例上完美接收
JsonUtility.FromJson ()返回的对象类型。
step 3使用了iserialiazation界面,但还没结束呢!
注意:
其中UIPanelType是自定义枚举类型
UIPanelType.cs
using System.Collections; using system.collections.generic; 用户单元引擎; publicenumuipaneltype { item message,Knapsack,MainMenu,Shop,Skill,System,Task}此时运行unity将报告以下错误:
这个问题的错误报告的原因是我们自己定义的类型不能由Unity3D正确序列化。
Q:但是我们想让自己定义的类型序列化。 我该怎么办?
在A:中,可以考虑在序列化时将数据类型转换为可以在Unity3D中正确序列化的类型,然后在运行时通过反序列化将其转换为所需的类型。
这将使用ISerialiazationCallbackReceiver接口
类继承接口后,必须实现OnBeforeSerialize()方法和***OnAfterDeserialize () ***方法。
OnBeforeSerialize(): Unity3D在序列化对象之前调用方法。OnAfterDeserialize(): Unity3D在序列化后调用方法;
代码如下。
[ system.serializable ] publicclassuipanelinfo : iserializationcallbackreceiver { [ system.non serialized ] publicuipanelion 需要转换为UIPanelType类型的字段。 由于unity3D支持字符串类型的串行化公共字符串路径; publicstaticuipaneltypejsoncreatefromjson (stringjsonstring ) (returnjsonutility.fromjsonuipaneltypejson ) (JSON字符串) } public void OnAfterDeserialize () uipaneltypetype=(uipaneltype ) system.enum.parse(typeof ) uipaneltype ),paneltype panelType=type; } publicvoidonbeforeserialize (() publicclassuipaneltypejson//uipanelinfo包类包含“[System.Serializable]”特性) pupup 花了半天以上。
建议使用以下资源: 请对大家的学习有帮助。
bilibili :
33559 www.bilibili.com/video/av 1722636? p=2
3359 www.bilibili.com/video/av 33904479? p=23
如果有任何问题或建议,欢迎在评论区一起讨论。 ——刚进洞的鸡