目录
- 问题描述
- 上代码
- 测试代码
- 各位看官,打赏个1元吧
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 -> stringJsonMapper.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; }}}