TA的每日心情 | 奋斗 2021-3-1 00:52 |
---|
签到天数: 78 天 [LV.6]常住居民II
|
本帖最后由 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}
。
完毕。
|
|