Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 2887|回复: 0

[集合] 修改QuickLib使其serializer反序列化时支持不区分大小写

[复制链接]
  • TA的每日心情
    奋斗
    2021-3-1 00:52
  • 签到天数: 78 天

    [LV.6]常住居民II

    发表于 2020-12-10 17:29:00 | 显示全部楼层 |阅读模式
    本帖最后由 ouyongke 于 2020-12-28 03:36 编辑

    QuickLib确实是很厉害的包,功能非常强悍。
    今天试用了他的序列化/反序列化Demo,发现他的JsonToObject()函数居然是区分大小写的,但是单独取值的函数GetJsonPairValueByName()和GetJsonPairByName()又可以不区分大小写,属性是UseJsonCaseSense: Boolean。
    看了看Lazarus 2.0.10的底层,fpjson.pp 中其实支持不区分大小写,其参数名叫 CaseInsensitive。
    哪位英文好的,或者有github账号的大牛,麻烦跟QuickLib的几位作者联系一下,也让它正式的支持不区分大小写。

    言归正传,以下是我的修改:
    环境:
    QuickLib ver 2.0 (最新版在Lazarus下编译不通过,且目前Modify于2020.06.16的最新版本中,Quick.Json.Serializer.pas单元,作者还未做出修改)
    Lazarus ver 2.0.10

    修改位置一:
    Quick.Json.Serializer.pas
    function TRTTIJson.DeserializeProperty(aObject : TObject; const aName : string; aProperty : TRttiProperty; const aJson : TJSONObject) : TObject;
    var
      。。。。
    begin
        Result := aObject;
        rValue := nil;
        {$IFNDEF FPC}
         //member := TJSONPair(aJson.GetValue(aName));      // 不是ouyongke注释的
         member := GetJsonPairValueByName(aJson,aName);  // 作者在此函数中已支持UseJsonCaseSense
        {$ELSE}
        member := TJsonObject(aJson.Find(aName, not UseJsonCaseSense));
        //member := TJsonObject(aJson.Find(aName));  // 修改此行以支持UseJsonCaseSense的传参 by ouyongke 2020.12.10
        {$ENDIF}
        if member <> nil then  
        。。。
    end;

    修改位置二:
    Quick.Json.fpc.Compatibility.pas
      TJsonObject = class(fpjson.TJsonObject)
      private
        function GetPair(Index : Integer): TJsonPair;
      public
        procedure AddPair(aValue : TJsonPair); overload;
        procedure AddPair(const aName : TJsonStringType; aValue : TJsonData); overload;
        class function ParseJSONValue(const JSON: string; const UseUTF8: Boolean = True): TJSONData;
        function GetValue(const aName : string) : TJsonData;
        // 继承并 overload 此函数为支持 CaseInsensitive by ouyongke 2020.12.10
        Function Find(Const AName : String; CaseInsensitive : Boolean = False) : TJSONData; overload;
        function ToJson : TJSONStringType;
        property Pairs[Index : Integer] : TJsonPair read GetPair; default;
      end;

    修改位置三:
    Quick.Json.fpc.Compatibility.pas
    Function TJsonObject.Find(Const AName : String; CaseInsensitive : Boolean = False) : TJSONData;
    {$ifdef pas2js}
    begin
      if FHash.hasOwnProperty('%'+AName) then
        Result:=TJSONData(FHash['%'+AName])
      else
        Result:=nil;
    end;
    {$else}
    Var
      I : Integer;
    begin
      // 为IndexOfName传递 CaseInsensitive 参数 by ouyongke 2020.12.10
      I:=IndexOfName(AName, CaseInsensitive);
      // I:=IndexOfName(AName);  // 此行与 fpjson.TJsonObject 中Find()不同
      If (I<>-1) then
        Result:=Items
      else
        Result:=Nil;
    end;
    {$endif}

    完毕。










    回复

    使用道具 举报

    *滑块验证:

    本版积分规则

    QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

    GMT+8, 2025-5-2 10:17 , Processed in 0.027932 second(s), 10 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表