C#探索之路(7):初探LitJson库并了解其中json的解析原理与处理报错

news2024/12/23 6:50:15

C#探索之路(7):使用LitJson库解析数据抛出的异常错误修复指南与途径Tips

对Json格式的了解程度一定程度上影响了解决JSON相关问题的效率;

文章目录

    • C#探索之路(7):使用LitJson库解析数据抛出的异常错误修复指南与途径Tips
        • 1、初步较为系统的去探索LitJson
        • 2、遇到的问题:
        • 3、导致的原因:
        • 4、踩坑代码:
        • 5、解决方案:
        • 6、ChatGpt会如何处理:
        • 7、完整代码实现:
        • 8、参考链接与工具:

1、初步较为系统的去探索LitJson

由于最初并没有系统的去了解过Json,大多都是临时看几篇文档,也正是因如此,所以才导致对Json的相关处理其实并不熟悉。

我们要做的有两步:

第一步,就是下载对应的Litjson库并导入到项目中去

第二步,就是通过库中的Json的封装形式,来构造Json对象并且做解析以便于进一步分析问题;

2、遇到的问题:

The JsonData instance has to be initialized first

3、导致的原因:

平台提供一个用json封装的string字符串,其中包含了数组类型的数据,但是在特殊的情况下,数组内容为空,客户端通过JsonData对数据进行解析后,并且对解析出来的Json对象中的数组成员进行遍历的过程中,抛出异常:

The JsonData instance has to be initialized first

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R6SLPjmL-1682480776617)(E:/LearnPath/[0006]Note/WizNote/images/image-20230423150721854.png)]

4、踩坑代码:

  • 第一种错误

    //常见的变量类型
     JsonData jsonData1 = JsonMapper.ToObject(test1String);
     JsonData json2ObjectValue1 = jsonData1["TestIntArrayList"];
     // 第一种错误尝试:
    // 报错代码:NullReferenceException: Object reference not set to an instance of an object
          foreach (JsonData o in json2ObjectValue1)
          {
              Debug.Log($"0:{o}");
          }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-34dwHM3t-1682480776618)(E:/LearnPath/[0006]Note/WizNote/images/image-20230423151135254.png)]

    第一种错误后,通常会想着谁报错,“防范谁”,通常会自以为的去判断 jsonData1 ,看到编辑器提示的那就更加确信了,实际报错的原因是因为 stirng报空了,抛出指向的报错却是Json未初始化;

    这是由于我们遍历 json2ObjectValue1.Count 时去收集了变量的信息,抛出的错误源头的异常,foreach 为空时,则停止遍历了;

    第二种错误:

    // 第二种错误尝试:
    // 报错代码:NullReferenceException: Object reference not set to an instance of an object
          if (jsonData1 !=null && json2ObjectValue1.Count > 0)
          {
              foreach (JsonData o in json2ObjectValue1)
              {
                  Debug.Log($"0:{o}");
              }
          }
    

    这个跟平台提供的字符串的结构有关,如果数组为空返回的Null,那边边界处理起来就会很清晰。但是奇怪的是我遇到的这个的情况是数组没有内容,但是JsonData又不为空。依旧还是返回了一个类的样式结构过来的时候,并且返回的字符串为“”时,边界问题处理起来就不那么清晰了,当对一个不清晰的数据进行处理的时候,就很容易遇到这种问题

    5、解决方案:

    当然解决这个问题的也很简单,对解析出来的对应的字符串判空即可,如果为了确保正确,

    则同时对josnData以及 从josnData中获取josnData[“xxxx”]变量(为string类型)判空即可解决问题;

    if(jsonData!= null && josnData["xxxx"].ToString()!=string.Empty)
    {
     ...
    }
    

6、ChatGpt会如何处理:

相信大家也看到了最近chagpt的一个热度与趋势,由于篇幅太长的原因,所以我就没有粘贴所有的代码至gpt中去一一做测试了,我便用以下代码做了一个gpt的尝试。不得不承认,在大数据语言模型里面,chatgpt确实有了一个很强大的表现力。

测试代码:

//测试常见的变量类型
        TestToJSON test1 = new TestToJSON(1, 2, 3, true);
        string test1String = JsonMapper.ToJson(test1);
        JsonData jsonData1 = JsonMapper.ToObject(test1String); 
        JsonData json2ObjectValue1 = jsonData1["TestIntArrayList"];
        foreach (JsonData o in json2ObjectValue1)
        {
            Debug.Log($"0:{o}");
        }

gpt回复1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwcNHr86-1682480776619)(E:/LearnPath/[0006]Note/WizNote/images/image-20230426114347077.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K7fKJIgk-1682480776619)(E:/LearnPath/[0006]Note/WizNote/images/image-20230426114358216.png)]

7、完整代码实现:

using System.Collections.Generic;
using System.Diagnostics.Contracts;
using LitJson;
using UnityEngine;
using Debug = UnityEngine.Debug;

public class TestJsonData : MonoBehaviour
{
    void Start()
    {
        #region 1、将C#类转换成Json对象  -- ToJsonString

        //测试常见的变量类型
        TestToJSON test1 = new TestToJSON(1, 2, 3, true);
        string test1String = JsonMapper.ToJson(test1);
        Debug.Log("测试常见的变量类型::\\n通过JsonMapper包装后的字符串为:" + test1String.ToString());
        // Output:
        // {"TestbyteValue":1,"TestShortValue":2,"TestValue":3,"TestBoolValue":true,"TestIntArrayList":null,"TestCharArrayList":null,"TestStringValue":null,"Test2DIntsArrayList":null,"Test2DCharsArrayList":null,"Test2DStringsArrayList":null}

        //测试常见的字符串、数组类型
        TestToJSON test2 = new TestToJSON(new int[] {1, 1, 1}, new char[] {'2', '2', '2'}, "hello world!");
        string test2String = JsonMapper.ToJson(test2);
        Debug.Log("测试常见的字符串、数组类型::\\n通过JsonMapper包装后的字符串为:" + test2String.ToString());
        // Output:
        // {"TestbyteValue":0,"TestShortValue":0,"TestValue":0,"TestBoolValue":false,"TestIntArrayList":[1,1,1],"TestCharArrayList":["2","2","2"],"TestStringValue":"hello world!","Test2DIntsArrayList":null,"Test2DCharsArrayList":null,"Test2DStringsArrayList":null}

        //测试部分构造的常见的多维数组类型
        TestToJSON test3 = new TestToJSON(new int[][] {new[] {1, 1}, new[] {2, 2}}, new char[][] {new[] {'1', '1'}, new[] {'2', '2'}}, new string[] {"helloWorld1", "helloWorld2"});
        string test3String = JsonMapper.ToJson(test3);
        Debug.Log("测试常见的多维数组类型::\\n通过JsonMapper包装后的字符串为:" + test3String.ToString());
        // Output:
        //{"TestbyteValue":0,"TestShortValue":0,"TestValue":0,"TestBoolValue":false,"TestIntArrayList":null,"TestCharArrayList":null,"TestStringValue":null,"Test2DIntsArrayList":[[1,1],[2,2]],"Test2DCharsArrayList":[["1","1"],["2","2"]],"Test2DStringsArrayList":["helloWorld1","helloWorld2"]}

        //测试完整构造的常见的多维数组类型
        TestToJSON test4 = new TestToJSON(
            1, 2, 3, true,
            new int[] {1, 1, 1}, new char[] {'2', '2', '2'}, "hello world!",
            new int[][] {new[] {1, 1}, new[] {2, 2}}, new char[][] {new[] {'1', '1'}, new[] {'2', '2'}}, new string[] {"helloWorld1", "helloWorld2"}
        );
        string test4String = JsonMapper.ToJson(test4);
        Debug.Log("测试常见的多维数组类型::\\n通过JsonMapper包装后的字符串为:" + test4String.ToString());
        // Output:
        //{"TestbyteValue":1,"TestShortValue":2,"TestValue":3,"TestBoolValue":true,"TestIntArrayList":[1,1,1],"TestCharArrayList":["2","2","2"],"TestStringValue":"hello world!","Test2DIntsArrayList":[[1,1],[2,2]],"Test2DCharsArrayList":[["1","1"],["2","2"]],"Test2DStringsArrayList":["helloWorld1","helloWorld2"]}

        #endregion

        #region 2、将Json对象解析C#类 -- JsonToObject
        //要区分开两个情况,一种情况是对象的成员直接为Null,另一种情况是成员部位Null但成员变量值为默认null,即“”;
        // TestToJSON testArray = new TestToJSON(new int[]{});
        // string testArrayString = JsonMapper.ToJson(testArray);//先封装一遍
        // JsonData arrayJsonData = JsonMapper.ToObject(testArrayString);
        //直接解析 -- 无报错
        // if (arrayJsonData!=null )
        // {
        //     Debug.Log("arrayJsonData 不为空");
        // }
        // List<int> outputValue = new List<int>();
        // foreach (JsonData comData in arrayJsonData["TestIntArrayList"])
        // {
        //     Debug.Log("jsondata数据解析成功");
        //     outputValue.Add((int)comData);
        // }
        //间接解析 -- 没报错
        // ProtoJson Info = new ProtoJson();
        // Info.Parse(arrayJsonData);
        // List<int> testList = new List<int>();
        // if (arrayJsonData!=null)//&& Info.testData.ToString()!=string.Empty 屏蔽报错处理
        // {
        //     foreach (JsonData tag in Info.testData)
        //     {
        //         testList.Add((int) tag);
        //     }
        // }
        
        //常见的变量类型
        JsonData jsonData1 = JsonMapper.ToObject(test1String); 
        JsonData json2ObjectValue1 = jsonData1["TestIntArrayList"];
        // 第一种错误尝试:
        // 报错代码:NullReferenceException: Object reference not set to an instance of an object
         // foreach (JsonData o in json2ObjectValue1)
         // {
         //     Debug.Log($"0:{o}");
         // }
        
         // 第二种错误尝试:
         // 报错代码:NullReferenceException: Object reference not set to an instance of an object
         // if (jsonData1 !=null && json2ObjectValue1.Count > 0)
         // {
         //     foreach (JsonData o in json2ObjectValue1)
         //     {
         //         Debug.Log($"0:{(int)o}");
         //     }
         // }
         
         // 正确的解析方式:无非就是过滤,做好边界判断
         Contract.Assert(json2ObjectValue1!=null, "Json解析数据:json2ObjectValue1 为空?"); //condition:false=>halt 
         Contract.Assert(json2ObjectValue1.ToString()==null, "字符串为什么为空,请检查对应的数据");

         List<int> test = new List<int>();
         test.Add(1);
         test.Add(2);
         test.Add(3);
         test.Add(4);
         test.Add(5);
         





         #endregion

    }
}

public class TestToJSON
{
    //测试常见的变量类型
    public byte TestbyteValue;
    public short TestShortValue;
    public int TestValue;

    public bool TestBoolValue;

    //测试常见的字符串、数组类型
    public int[] TestIntArrayList;
    public char[] TestCharArrayList;
    public string TestStringValue;

    //测试常见的多维数组类型
    public int[][] Test2DIntsArrayList;
    public char[][] Test2DCharsArrayList;
    public string[] Test2DStringsArrayList;

    public TestToJSON(byte testbyteValue, short testShortValue, int testValue, bool testBoolValue)
    {
        TestbyteValue = testbyteValue;
        TestShortValue = testShortValue;
        TestValue = testValue;
        TestBoolValue = testBoolValue;
    }

    public TestToJSON(int[] testIntArrayList, char[] testCharArrayList, string testStringValue)
    {
        TestIntArrayList = testIntArrayList;
        TestCharArrayList = testCharArrayList;
        TestStringValue = testStringValue;
    }

    public TestToJSON(int[][] test2DIntsArrayList, char[][] test2DCharsArrayList, string[] test2DStringsArrayList)
    {
        Test2DIntsArrayList = test2DIntsArrayList;
        Test2DCharsArrayList = test2DCharsArrayList;
        Test2DStringsArrayList = test2DStringsArrayList;
    }

    public TestToJSON(byte testbyteValue, short testShortValue, int testValue, bool testBoolValue, int[] testIntArrayList, char[] testCharArrayList, string testStringValue, int[][] test2DIntsArrayList, char[][] test2DCharsArrayList,
        string[] test2DStringsArrayList)
    {
        TestbyteValue = testbyteValue;
        TestShortValue = testShortValue;
        TestValue = testValue;
        TestBoolValue = testBoolValue;
        TestIntArrayList = testIntArrayList;
        TestCharArrayList = testCharArrayList;
        TestStringValue = testStringValue;
        Test2DIntsArrayList = test2DIntsArrayList;
        Test2DCharsArrayList = test2DCharsArrayList;
        Test2DStringsArrayList = test2DStringsArrayList;
    }

    public TestToJSON(int[] testIntArrayList)
    {
        TestIntArrayList = testIntArrayList;
    }
}


public class ProtoJson
{
    public JsonData testData;
    
    public void Parse(JsonData JsonData)
    {
        testData = JsonData["TestIntArrayList"];
    }

}
 

8、参考链接与工具:

链接:
[1]: github:LitJson原生库
[2]: 经改造适用于Unity的LitJson库Github大佬链接
[3]: 马三改造LitJson博客
[4]: 一个Json格式验证与导出的链接
[5]: 一个Json在线格式转换的链接
[6]: 代码美化博客
在Issues中有显著提及到这个问题:The JsonData instance has to be initialized first

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QxVtFJo-1682480776620)(E:/LearnPath/[0006]Note/WizNote/images/image-20230423145511244.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TryHackMe-Mnemonic(boot2root)

Mnemonic I hope you have fun. 端口扫描 循例nmap FTP枚举 尝试anonymous Web枚举 进80 gobuster扫 对着webmasters再扫一下 对着backups继续扫 下载zip文件&#xff0c;发现有密码 zip2john john直接爆 查看note.txt, 给出了ftpuser hydra直接爆ftp 进到ftp 用wget下载所…

VR全景图片,探究VR全景图片为何如此受欢迎?

随着科技的不断进步&#xff0c;虚拟现实技术逐渐渗透到我们的日常生活中&#xff0c;为我们带来了许多前所未有的体验和乐趣。而其中&#xff0c;VR全景图片作为一种基于虚拟现实技术的图片展示形式&#xff0c;不仅在旅游、房地产、教育等领域得到了广泛的应用&#xff0c;也…

【Java基础】语法基础

本文适合有编程基础或是需要Java语言复习的家人们食用~ 一、Java语言介绍 本篇文章使用的JDK版本是1.8&#xff08;即JDK 8&#xff09;Java语言是运行在JVM上的&#xff0c;有了JVM&#xff0c;Java语言得以在不同操作系统上运行垃圾回收机制&#xff1a;Java语言提供了一种…

文献阅读 Meta transfer learning-based super-resolution infrared imaging

题目 Meta transfer learning-based super-resolution infrared imaging 基于元迁移学习的超分辨率红外成像 摘要 我们提出了一种具有元迁移学习和轻量级网络的红外图像超分辨率方法。我们设计了一个轻量级网络来学习低分辨率和高分辨率红外图像之间的映射。我们使用外部数据…

科大讯飞版ChatGPT开始内测《讯飞星火》

科大讯飞版ChatGPT产品&#xff0c;提前交卷了&#xff01; 就在昨夜&#xff0c;讯飞骤然向开发者提供了内测通道&#xff0c;取名为讯飞星火认知大模型对外开启内测。 还有个神奇的英文名字Spark Desk&#xff0c;据说有“火花桌面智能助手”的意思。 申请的过程很简单。用…

Speech and Language Processing-之文本规范化

在对文本进行几乎任何自然语言处理之前&#xff0c;都必须对文本进行规范化。至少有三个任务通常作为任何规范化过程的一部分: 1. 分词 2. 规范化词格式 3. 句子分段 让我们从一个简单的(如果有点幼稚的话)单词标记化和非malization(以及频率计算)版本开始&#xff0c;它可以…

CIC 滤波器——不同长度的单级CIC滤波器的频谱特性

CIC 滤波器 % 多速率信号处理过程的关键是设计满足要求的抗混叠滤波器&#xff1a; % 第一&#xff1a;滤波器在有用信号频段内的纹波系数满足要求&#xff1b; % 第二&#xff1a;抽取或内插处理后&#xff0c;在有用信号频段内不产生频谱混叠&#xff1b; % 第三&#xf…

ASM磁盘组增加磁盘

续昨天的问题&#xff0c;DATA磁盘组空间不足的问题&#xff0c;客户也紧张&#xff0c;一早就讨论方案&#xff0c;新增2个2T的磁盘&#xff0c;将原来2个500G磁盘下线&#xff0c;下午存储端配置后&#xff0c;下面就是主机和数据库的事情&#xff08;为了避免客户信息泄露&a…

生成树协议 STP

文章目录 1 概述2 生成树协议 STP2.1 桥 ID&#xff08;Bridge ID&#xff09;2.2 路径开销&#xff08;Path Cost&#xff09;2.3 示例 3 扩展 1 概述 #mermaid-svg-QRMpkzeB3Xf66zNv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#3…

【学习笔记】- 零基础学React

React是用于构建用户界面的JavaScript库。想要深入学习 react &#xff0c;就应该从 jsx 入手 react脚手架初始化项目 >> npm install -g create-react-app >> create-react-app proname >> npm run start运行之后&#xff0c;出现以下画面&#xff0c;至此…

DHCP服务

~ 安装和配置 DHCP 服务&#xff0c;为办公区域网络提供地址上网&#xff1b; ~ 创建地址池 inside_pool,地址池范围 192.168.0.100 - 192.168.0.200&#xff1b; ~ 根据题目 要求正确的配置网关和DNS信息&#xff1b; ~ 修改AppSrv 的dhcp服务器默认备份时间为150秒&#x…

案例3:Java汽车保养维修系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

dll文件丢失怎么恢复,修复丢失dll的全部方法分享

dll文件丢失怎么恢复&#xff1f;其实DLL 或称为动态链接库文件&#xff0c;是 Windows 操作系统中的重要文件之一&#xff0c;它包含了被应用程序或操作系统内部使用的函数和程序代码。当应用软件或系统内置应用启动时&#xff0c;会自动加载对应的 DLL 文件以获得所需要的程序…

ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

第一章、生态系统服务讲解 1.生态系统服务概念和基本理论 ​ 2.生态系统服务评估方法与模型讲解 ​ ​ 3.生态系统服务权衡与协同研究方法与意义 ​ 4.文献可视化分析 ​ ​ 第二章、平台基础 一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据预处理4…

FLink 里面的时间语义说明

本文说明一下flink的时间语义 处理时间&#xff08;processTIme&#xff09; 执行相关操作的机器系统时间。 如果flink的流式处理程序是基于processtime。那么代码中所有的操作都是将基于运算符的机器系统时钟时间。每小时的processTime window包括在系统时钟指示完整一个小时…

直线导轨水平仪零位调整方法

对于直线导轨的使用&#xff0c;相信很多人都知道&#xff0c;这主要是因为直线导轨的使用范围非常广泛&#xff0c;小到抽屉&#xff0c;大到机械设备&#xff0c;我们都能看到他的身影&#xff0c;接触得多自然就熟悉了。 事实上&#xff0c;大家对直线导轨的了解可能就仅限于…

BM41-输出二叉树的右视图

题目 请根据二叉树的前序遍历&#xff0c;中序遍历恢复二叉树&#xff0c;并打印出二叉树的右视图 数据范围&#xff1a; 0≤n≤10000 要求&#xff1a; 空间复杂度 O(n)&#xff0c;时间复杂度 O(n) 如输入[1,2,4,5,3],[4,2,5,1,3]时&#xff0c;通过前序遍历的结果[1,2,4,…

Redis——BigKey问题

目录 MoreKey案例 测试数据 如何向redis数据库中一次性的插入100W条数据 如何将 100W条数据一次性写入redis数据库中 遍历百万、千万级别数据能否使用keys *? 生产上如何限制keys *、flushdb、flushall等危险命令&#xff1f; 不使用keys *使用什么遍历&#xff1f; 使…

Spring学习小结_2

文章目录 篇112 Bean的生命周期Bean实例属性填充循环引用Aware接口Spring IoC 整体流程总结 13 Spring整合MyBatis剖析 篇1 Spring学习小结_1 https://blog.csdn.net/m0_58730471/article/details/130075657?spm1001.2014.3001.5501 12 Bean的生命周期 Spring Bean的生命周期…

当下火爆出圈的 ChatGPT ,你了解多少?

ChatGPT 是什么&#xff1f;ChatGPT 有什么特点&#xff1f;ChatGPT 可以做什么&#xff1f;ChatGPT 初体验 当下 AI 聊天程序 ChatGPT 可谓如火如荼&#xff0c;因它给出的答案通常更为合理且更有人情味&#xff0c;全网讨论度非常高。 ChatGPT 是什么&#xff1f; ChatGPT 是…