Unity C#对象合并Json数据中相同属性字段的值,C#对象中的某个属性和json中的同名属性的值合并

在Unity中,当接收到部分更新的Json数据时,如何避免将不需要更新的字段初始化为默认值。通过遍历已有C#对象的属性,与Json数据对比,仅更新存在的字段,实现数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题介绍:

两个类型

// 同步数据,包含用户数据

public class SysMessage
{
    public int dti { get;  set; }
    public UserData playerJMsg { get;  set; }
}

// 用户数据

public class UserData
{
    public string playerId{ get; set; } //数字ID

    public string email{ get; set; }//邮箱
    public int excution { get; set; }//体力

       public long gold { get; set; }//游戏币

}

SysMessage类型一般是心跳返回的,而且心跳返回的数据不是完整数据,只会同步某些字段,比如只同步 UserData中的gold.

我在收到服务器的json数据后,都是直接解析成类的

SysMessage data = JsonMapper.ToObject<SysMessage>(@request.downloadHandler.text);

然而类的解析后 ,一些不需要同步的字段初始化了,也就是会出现 email是null,  excution是0

导致不知道是不是需要同步的字段,我们只需要同步json数据中包含的字段就可以了

解决方法

sys1 是直接收到的json数据转JsonData : JsonMapper.ToObject(@request.downloadHandler.text)["sysMessage"]

这里用的unityWebRequest请求的json数据

 var sys = sys1 as JsonData;
        if (m_user == null) m_user = JsonMapper.ToObject<UserData>(sys["playerJMsg"].ToJson());
        else
        {
            try
            {
                var player = sys["playerJMsg"];
                // 合并user数据
                foreach (var p in m_user.GetType().GetProperties())
                {
                    try
                    {
                        if (null != player[p.Name])
                        {// 需要同步数据
                             if (p.Name == "pet")
                                {// 是一个类型
                                    p.SetValue(m_user, JsonMapper.ToObject<HeroData>(JsonMapper.ToJson(player[p.Name])));
                                }
                                else
                                {// 判断原始数据类型,否则转换可能失败
                                    if (p.PropertyType.Name == "String")
                                    {
                                        p.SetValue(m_user, player[p.Name].ToString());
                                    }
                                    else if (p.PropertyType.Name == "Int64")
                                    {
                                        p.SetValue(m_user, Convert.ToInt64(player[p.Name].ToString()));
                                    }
                                    else if (p.PropertyType.Name == "Int32")
                                    {
                                        p.SetValue(m_user, Convert.ToInt32(player[p.Name].ToString()));
                                    }
                                } 
                        }
                    }
                    catch
                    {
                        Console.WriteLine("playerJMsg not found "+ p.Name);
                    }
                }
            }
            catch (FormatException)
            {
                Console.WriteLine("sys not found playerJMsg");
            }
        }

这里使用try catch是因为 jsonData一旦是一个不包含key就马上报错,比如 sys中不包含字段playerMsg,如果直接使用sys["playerMsg"]就会报错,这里是尝试获取我们需要的字段

System.Collections.Generic.KeyNotFoundException: The given key was not present i

这样就做到了,只同步有的数据,防止json直接转class导致的默认值问题,分不清哪些是同步过来的 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值