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

2024-01-08 19:34:55


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元吧

请添加图片描述

文章来源:https://blog.csdn.net/AnYuanLzh/article/details/135462860
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。