LitJson扩展-序列化与反序列化未支持的类型

笔记:

如果需要序列化多个变量组成的对象,例如vector2,vector3,格式是:

        writer.WriteObjectStart();
        writer.WritePropertyName("x");
        writer.Write(v.x.ToString());
        writer.WriteObjectEnd();

同时反序列化时传入的参数类型是JsonReader

如果是单个值,例如float(最新版的litjson已经支持float),之间使用Write将其转换的字符串写入,反序列化时传入的参数类型是String

下面是Vector2,Vector3,float类型的扩展,在使用LitJson之前执行一遍就行

ps:使用了百度的AI对话帮忙解答,真好用

/// <summary>
/// 添加额外的类型的序列化方法
/// </summary>
void RegisterNewType()
{
    #region vector2
    Action<Vector2, JsonWriter> writeVector2 = (v, w) => {
        w.WriteObjectStart();//开始写入对象
        w.WritePropertyName("x");
        w.Write(v.x.ToString());//写入值
        w.WritePropertyName("y");
        w.Write(v.y.ToString());//写入值
        w.WriteObjectEnd();
    };

    JsonMapper.RegisterExporter<Vector2>((v, w) => {
        writeVector2(v, w);
    });

    ImporterFunc<JsonReader , Vector2 > readVector2 = (reader) =>
    {
        
        if (reader.Read() && reader.Token == JsonToken.ObjectStart)
        {
            float x = 0f, y = 0f;

            // 读取对象的属性,直到遇到ObjectEnd
            while (reader.Read())
            {
                if (reader.Token == JsonToken.PropertyName)
                {
                    string propertyName = reader.Value.ToString();
                    if (reader.Read() && propertyName == "x")
                    {
                        if (float.TryParse(reader.Value.ToString(), out float parsedX))
                        {
                            x = parsedX;
                        }
                        else
                        {
                            throw new JsonException("Invalid 'x' value in Vector2.");
                        }
                    }
                    else if (reader.Read() && propertyName == "y")
                    {
                        if (float.TryParse(reader.Value.ToString(), out float parsedY))
                        {
                            y = parsedY;
                        }
                        else
                        {
                            throw new JsonException("Invalid 'y' value in Vector2.");
                        }
                    }
                }
                else if (reader.Token == JsonToken.ObjectEnd)
                {
                    break; // 对象结束,跳出循环
                }
            }

            return new Vector2(x, y);
        }
        else
        {
            throw new JsonException("Cannot convert to Vector2! Expected an object.");
        }
    };

    JsonMapper.RegisterImporter(readVector2);
    
    #endregion


    #region Vector3
    Action<Vector3, JsonWriter> writeVector3 = (v, w) => {
        w.WriteObjectStart();//开始写入对象

        w.WritePropertyName("x");
        w.Write(v.x.ToString());//写入值
        w.WritePropertyName("y");
        w.Write(v.y.ToString());//写入值
        w.WritePropertyName("z");
        w.Write(v.z.ToString());//写入值

        w.WriteObjectEnd();
    };

    JsonMapper.RegisterExporter<Vector3>((v, w) => {
        writeVector2(v, w);
    });

    ImporterFunc<JsonReader, Vector3> readVector3 = (reader) =>
    {
       
        if (reader.Read() && reader.Token == JsonToken.ObjectStart)
        {
            float x = 0f, y = 0f,z = 0f;

            // 读取对象的属性,直到遇到ObjectEnd
            while (reader.Read())
            {
                if (reader.Token == JsonToken.PropertyName)
                {
                    string propertyName = reader.Value.ToString();
                    if (reader.Read() && propertyName == "x")
                    {
                        if (float.TryParse(reader.Value.ToString(), out float parsedX))
                        {
                            x = parsedX;
                        }
                        else
                        {
                            throw new JsonException("Invalid 'x' value in Vector3.");
                        }
                    }
                    else if (reader.Read() && propertyName == "y")
                    {
                        if (float.TryParse(reader.Value.ToString(), out float parsedY))
                        {
                            y = parsedY;
                        }
                        else
                        {
                            throw new JsonException("Invalid 'y' value in Vector3.");
                        }
                    }
                    else if (reader.Read() && propertyName == "z")
                    {
                        if (float.TryParse(reader.Value.ToString(), out float parsedZ))
                        {
                            z = parsedZ;
                        }
                        else
                        {
                            throw new JsonException("Invalid 'z' value in Vector3.");
                        }
                    }
                }
                else if (reader.Token == JsonToken.ObjectEnd)
                {
                    break; // 对象结束,跳出循环
                }
            }

            return new Vector3(x, y, z);
        }
        else
        {
            throw new JsonException("Cannot convert to Vector3! Expected an object.");
        }

    };

    JsonMapper.RegisterImporter(readVector3);

    #endregion

    #region float

    JsonMapper.RegisterExporter<float>((v, w) => {
        
        w.Write(v.ToString());//写入值
    });
    JsonMapper.RegisterImporter<string , float>((str) =>
    {
        
            
            // 尝试将字符串解析为float
            if (float.TryParse(str, out float parsedFloat))
            {
                return parsedFloat;
            }
            else
            {
                throw new JsonException("Invalid float value.");
            }
        

    });
    JsonMapper.RegisterImporter<JsonReader,float>((reader) =>
    {
        if (reader.Read() && reader.Token == JsonToken.String)
        {
            string value = reader.Value.ToString();
            // 尝试将字符串解析为float
            if (float.TryParse(value, out float parsedFloat))
            {
                return parsedFloat;
            }
            else
            {
                throw new JsonException("Invalid float value.");
            }
        }
        else
        {
            throw new JsonException("Cannot convert to float! Expected a string.");
        }

    });


    #endregion




}

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值