LitJson-Json字符串转对像时:整型与字符串或字符串转:整型进的类型不一致的处理


Json数据格式是大家在游戏开中常量用的一种数据格式,某种程度上可以说是必备的。对unity开发来说,LitJson这个json库应该是被使用最多的json库了。

问题描述

今天说要的其中的这个api: JsonMapper.ToObject(json),这个api应该是大家很常用的了,它的作用是将json string反序列化成一个类对象。
要求一json结构中的字段的类型和类型结构中的对应字段的类型一致,不然后转换就会出错。

如:现在有这样一个情况!

{
    "age":"18",
    "count":100
}
public class TestClass
{
    public int age { get; set; }
    public string count { get; set; }
}

大家可看到,类中字段的类型int与string刚好都是反的。int->string会报错,string->int也有报错。
在这里插入图片描述

但我们希望能兼容这种情况。
其它litjson这个库给我提供了处理文案的,它允许我们自定类型映射处理。
这是这两个方法
在这里插入图片描述
下面我这里只展示反序列化的处理方法,一般也只要这个就ok了。而且只处理string->int 和 int->string的实现,其它的实现用到的情况比较少,如果有需要可以参加扩展.

上代码

只要是app初始时,调用LitJsonUtils.Init()即可

using System;
using LitJson;

namespace Main
{
    public static class LitJsonUtils
    {
        // static LitJsonUtils()
        // {
        //     RegisterCustomImporters();
        // }

        public static void Init()
        {
            RegisterCustomImporters();
        }

        /// <summary>
        /// 自定类类型 反序列化
        /// 反序列化
        /// json->object
        /// type1->type2
        /// </summary>
        public static void RegisterCustomImporters ()
        {
            // string -> int (各种整形)
            JsonMapper.RegisterImporter<string, sbyte>(input =>
            {
                if (string.IsNullOrEmpty(input))
                {
                    return 0;
                }
                return Convert.ToSByte(input);
            });
            JsonMapper.RegisterImporter<string, byte>(input =>
            {
                if (string.IsNullOrEmpty(input))
                {
                    return 0;
                }
                return Convert.ToByte(input);
            });
            JsonMapper.RegisterImporter<string, ulong>(input =>
            {
                if (string.IsNullOrEmpty(input))
                {
                    return 0;
                }
                return Convert.ToUInt64(input);
            });
            JsonMapper.RegisterImporter<string, long>(input =>
            {
                if (string.IsNullOrEmpty(input))
                {
                    return 0;
                }
                return Convert.ToInt64(input);
            });
            JsonMapper.RegisterImporter<string, short>(input =>
            {
                if (string.IsNullOrEmpty(input))
                {
                    return 0;
                }
                return Convert.ToInt16(input);
            });
            JsonMapper.RegisterImporter<string, ushort>(input =>
            {
                if (string.IsNullOrEmpty(input))
                {
                    return 0;
                }
                return Convert.ToUInt16(input);
            });
            JsonMapper.RegisterImporter<string, int>(input =>
            {
                if (string.IsNullOrEmpty(input))
                {
                    return 0;
                }
                return Convert.ToInt32(input);
            });
            JsonMapper.RegisterImporter<string, uint>(input =>
            {
                if (string.IsNullOrEmpty(input))
                {
                    return 0;
                }
                return Convert.ToUInt32(input);
            });

            // (各种整形)int -> string
            JsonMapper.RegisterImporter<sbyte, string>(input => input.ToString());
            JsonMapper.RegisterImporter<byte, string>(input => input.ToString());
            JsonMapper.RegisterImporter<ulong, string>(input => input.ToString());
            JsonMapper.RegisterImporter<long, string>(input => input.ToString());
            JsonMapper.RegisterImporter<short, string>(input => input.ToString());
            JsonMapper.RegisterImporter<ushort, string>(input => input.ToString());
            JsonMapper.RegisterImporter<int, string>(input => input.ToString());
            JsonMapper.RegisterImporter<uint, string>(input => input.ToString());


        }
    }
}

测试代码

using LitJson;
using Main;
using UnityEngine;

public class MyTest : MonoBehaviour
{
    private void Start()
    {
        Test();
    }
    static void Test()
    {
        LitJsonUtils.Init();
        string json = "{\"age\":\"18\",\"count\":100}";
        TestClass myClass = JsonMapper.ToObject<TestClass>(json);
        Debug.Log(myClass!=null);
        if (myClass != null)
        {
            Debug.Log($"age={myClass.age} count = {myClass.age}");
        }
    }
    class TestClass
    {
        public int age { get; set; }
        public string count { get; set; }
    }
 }

在这里插入图片描述

各位看官,打赏个1元吧

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年中国电子学会青少年编程等级考试安排的通知

各有关单位、全体考生: 中国电子学会青少年等级考试&#xff08;以下简称等级考试&#xff09;是中国电子学会为落实《全民科学素质行动规划纲要》&#xff0c;提升青少年电子信息科学素质水平而开展的社会化评价项目。等级考试自2011年启动以来&#xff0c;作为中国电子学会科…

AGV用120°激光扫描避障雷达传感器DE系列功能与通道切换操作说明

AGV用120激光扫描避障雷达传感器DE系列&#xff0c;包含DE-4211、DE-4611、DE-4311、DE-4511等型号&#xff0c;可帮助AGV/AMR/机器人快速精准地检测障碍物&#xff0c;确保系统运行安全&#xff0c;帮助智能停车系统完成准确的数据判定&#xff0c;实现车位或充电桩占用检测等…

Linux 期末复习

Linux 期末复习 计算机历史 硬件基础 1&#xff0c;计算机硬件的五大部件&#xff1a;控制器、运算器、存储器、输入输出设备 2&#xff0c;cpu分为精简指令集(RISC)和复杂指令集(CISC) 3&#xff0c;硬件只认识0和1&#xff0c;最小单位是bit&#xff0c;最小存储单位是字…

【设计模式】一文理解记住设计模式的原则

目录——阅读所需预计5-10分钟 &#x1f396;️前言&#x1f3af;单一职责原则&#x1f4e3;1. 定义&#x1f49e;2. 定义很抽象&#xff0c;咱继续看&#x1f389;3. 举几个栗子&#x1f49e;4. 以上栗子出现了一个问题&#xff0c;单一职责的划分究竟可以分多细&#x1f449;…

掌握Lazada API接口:开启电商开发新篇章,引领业务增长潮流

一、概述 Lazada API接口是Lazada平台提供的软件开发工具包&#xff0c;它允许第三方开发者通过编程方式访问Lazada平台上的商品、订单、用户等数据&#xff0c;并执行相关操作。通过使用Lazada API接口&#xff0c;开发者可以快速构建与Lazada平台集成的应用程序&#xff0c;…

Ubuntu 18.04.5 LTS 解决安装包复杂依赖相关问题解决的主要法则和VIM的安装实录

前言&#xff1a;目标和环境 环境&#xff1a; Ubuntu 18.04.5 LTSVMware 目标&#xff1a; 安装vim&#xff0c;解决包依赖的冲突&#xff1a; 本文&#xff0c;通过一个很好的实例&#xff0c;诠释了&#xff0c;LINUX系统下&#xff0c;安装一个应用遇到的依赖库问题如何…

单片机原理及应用:中断系统结构与控制寄存器

大家好啊&#xff0c;这几天因为考试断更了一段时间&#xff0c;现在放假了也可以恢复正常的更新速度了。今天我们来认识一下单片机的中断系统&#xff0c;这里可以说是我们学习单片机以来第一个核心功能&#xff0c;我们会分几期内容来深入了解中断系统的作用原理和应用方式。…

【K8S 云原生】Kurbernets集群的调度策略

目录 一、Kubernetes的list-watch机制 1、List-watch 2、创建pod的过程&#xff1a; 二、scheduler调度的过程和策略&#xff1a; 1、简介 2、预算策略&#xff1a;predicate 3、优先策略&#xff1a; 3.1、leastrequestedpriority&#xff1a; 3.2、balanceresourceal…

linux 系统安全及应用

一、账号安全基本措施 1.系统账号清理 1.将用户设置为无法登录 /sbin/nologin shell——/sbin/nologin却比较特殊&#xff0c;所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已&#xff0c;并不是说这个账号就无法使用系统资源。举例来说&#xff0c;…

MySQL语法练习-DML语法练习

文章目录 0、相关文章1、添加数据2、修改数据3、删除数据4、总结 0、相关文章 《MySQL练习-DDL语法练习》 1、添加数据 # 给指定字段添加数据 insert into 表名 (字段名1,字段名2,...) values(值1,值2...);# 给全部字段添加数据 insert into 表名 values(值1,值2,...);#批量…

Mac robotframework+pycharm运行suite报错情况:ImportError: No module named request

报错实例&#xff1a; 当前Preferences–>Tool–>External Tools Suite配置&#xff0c;显示使用的python为2.7版本&#xff0c;robotframework安装在当前版本的python中&#xff1a; 但是我pycharm现在的环境配置的python为3.11&#xff0c;当前使用的RF与当前使用的py…

5.2 Android BCC环境搭建(adeb版,下)更新中

五&#xff0c;运行adeb shell adeb shell 六&#xff0c;其他指令 6.1 从开发机移除adeb adeb remove 6.2 更新开发机adeb deb git-pull 6.3 使用ssh替代adeb进行与android设备的通信 adeb --ssh <uri> --sshpass <pass> <cmd> 七&#xff0c;BCC配置…

1-05使用VS调式程序

一、概述 写代码总不是一帆风顺的&#xff0c;总会碰到一些问题&#xff0c;检查问题&#xff0c;排除错误&#xff08;也就是Debug程序&#xff09;&#xff0c;对于任何程序员而言都是基本功。 我们前面讲过&#xff0c;C语言是一门很容易出错&#xff0c;且自身不提供异常…

excel统计分析——LSD多重比较

参考资料&#xff1a;生物统计学 一篇教你搞定显著性差异分析abcd字母标记法 LSD&#xff08;least significant difference&#xff0c;最小显著差数法&#xff09;是R. A. Fisher提出的&#xff0c;又称为Fisher LSD检验法&#xff0c;是最早用于检验各组均数间两两差异的方…

软件工程概论---内聚性和耦合性

目录 一.耦合性 1.内容耦合 2.公共耦合 4.控制耦合 5.标记耦合&#xff08;特征耦合&#xff09; 6.数据耦合 7.非直接耦合 二.内聚性 1.偶然内聚 2.逻辑内聚 3.时间内聚 4.过程内聚 5.通信内聚 6.顺序内聚 7.功能内聚 一.耦合性 耦合性是指软件结构中模块相互…

java常用应用程序编程接口(API)——String概述及使用案例

前言&#xff1a; 开始学到api的String&#xff0c;整理下心得。打好基础&#xff0c;daydayup! API&#xff1a; API是什么&#xff1f; API&#xff08;Application Programming Interface&#xff09;又名应用程序编程接口。是别人编好的程序的合集。 为什么要使用API&…

YOLOv5改进 | 2023Neck篇 | 利用Gold-YOLO针对小目标进行检测(附完整修改教程 + 代码)

一、本文介绍 本文给大家带来的改进机制是Gold-YOLO利用其Neck改进v8的Neck,GoLd-YOLO引入了一种新的机制——信息聚集-分发(Gather-and-Distribute, GD)。这个机制通过全局融合不同层次的特征并将融合后的全局信息注入到各个层级中,从而实现更高效的信息交互和融合。这种…

关于订单超时后用户却已支付的解决方案

场景: 一般我们下的一些订单&#xff0c;比如电商平台、外卖平台的都是有超时时间的&#xff0c;默认一般15或者30分钟&#xff0c;那么超时未支付订单会被自动取消&#xff0c;那么如果刚好有人在关闭订单的时候去支付成功了&#xff0c;或者说支付平台延迟了一下&#xff0c;…

开启Android学习之旅-5-Activity全屏

Android 两种方式设置全屏&#xff1a; 1. 第一行代码中的方法 通过 getWindow().getDecorView()方法拿到当前Activity的DecorView,再调用 setSystemUiVisibility() 方法来改变系统UI的显示&#xff0c;这里传入了 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 和 View.SYSTEM_UI_…

【EAI 005】EmbodiedGPT:通过具身思维链进行视觉语言预训练的具身智能大模型

论文描述&#xff1a;EmbodiedGPT: Vision-Language Pre-Training via Embodied Chain of Thought 论文作者&#xff1a;Yao Mu, Qinglong Zhang, Mengkang Hu, Wenhai Wang, Mingyu Ding, Jun Jin, Bin Wang, Jifeng Dai, Yu Qiao, Ping Luo 作者单位&#xff1a;The Universi…