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