mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-04-20 11:09:24 +02:00
* Plug in browser JSON parser
This commit is contained in:
parent
41b44c8613
commit
9ac7450c3a
130
packages/fcl-json/fpjsonjs.pas
Normal file
130
packages/fcl-json/fpjsonjs.pas
Normal file
@ -0,0 +1,130 @@
|
||||
{
|
||||
This file is part of the Free Component Library
|
||||
|
||||
Use native parser for parsing JSON Data structures
|
||||
Copyright (c) 2020 by Michael Van Canneyt michael@freepascal.org
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
**********************************************************************}
|
||||
unit fpjsonjs;
|
||||
|
||||
{$mode objfpc}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, Types, fpjson;
|
||||
|
||||
Function JSValueToJSONData(aValue : JSValue) : TJSONData;
|
||||
Procedure HookGetJSONCallBack;
|
||||
Procedure UnHookGetJSONCallBack;
|
||||
|
||||
implementation
|
||||
|
||||
Uses JS;
|
||||
|
||||
function JSValueToJSONData(aValue: JSValue): TJSONData;
|
||||
|
||||
Var
|
||||
Obj: TJSObject Absolute aValue;
|
||||
v : JSValue;
|
||||
S : String;
|
||||
|
||||
begin
|
||||
Case GetValueType(aValue) of
|
||||
jvtNull : Result:=CreateJSON;
|
||||
jvtBoolean : Result:=CreateJSON(Boolean(aValue));
|
||||
jvtString : Result:=CreateJSON(String(aValue));
|
||||
jvtFloat : Result:=CreateJSON(TJSONFloat(aValue));
|
||||
jvtInteger:
|
||||
if (NativeInt(aValue)>Maxint) or (NativeInt(aValue)<-MaxInt) then
|
||||
Result:=CreateJSON(NativeInt(aValue))
|
||||
else
|
||||
Result:=CreateJSON(NativeInt(aValue));
|
||||
jvtArray :
|
||||
begin
|
||||
Result:=CreateJSONArray([]);
|
||||
for v in TJSValueDynArray(aValue) do
|
||||
TJSONArray(Result).Add(JSValueToJSONData(v));
|
||||
end;
|
||||
jvtObject :
|
||||
begin
|
||||
Result:=CreateJSONObject(Nil);
|
||||
For S in TJSObject.getOwnPropertyNames(Obj) do
|
||||
TJSOnObject(Result).Add(S,JSValueToJSONData(Obj.Properties[S]));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
Procedure JSONFromString(Const aJSON : TJSONStringType; Const AUseUTF8 : Boolean; Out Data : TJSONData);
|
||||
|
||||
Var
|
||||
Msg : String;
|
||||
aValue : JSValue;
|
||||
|
||||
begin
|
||||
msg:='';
|
||||
try
|
||||
aValue:=TJSJSON.Parse(aJSON);
|
||||
except
|
||||
On ES : TJSSyntaxError do
|
||||
Msg:=ES.message;
|
||||
on E : TJSError do
|
||||
Msg:=E.Message ;
|
||||
on O : TJSObject do
|
||||
Msg:='Unknown error : '+TJSJSON.stringify(O);
|
||||
else
|
||||
asm
|
||||
var b = new SyntaxError;
|
||||
console.log(SyntaxError.prototype.isPrototypeOf(b));
|
||||
|
||||
if ($e.hasOwnProperty('message')) {
|
||||
Msg = '' || $e.message;
|
||||
}
|
||||
end;
|
||||
end;
|
||||
if Msg<>'' then
|
||||
Raise EJSON.Create('Error parsing JSON: '+Msg);
|
||||
// We do this outside the try..except so that in case of errors, we get the original exception.
|
||||
Data:=JSValueToJSONData(aValue);
|
||||
end;
|
||||
|
||||
Procedure JSONFromStream(AStream : TStream; Const AUseUTF8 : Boolean; Out Data : TJSONData);
|
||||
|
||||
Var
|
||||
SS : TStringStream;
|
||||
|
||||
begin
|
||||
SS:=TStringStream.Create('');
|
||||
try
|
||||
SS.CopyFrom(aStream,0);
|
||||
JSONFromString(SS.DataString,False,Data);
|
||||
finally
|
||||
SS.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure HookGetJSONCallBack;
|
||||
begin
|
||||
SetJSONParserHandler(@JSONFromStream);
|
||||
SetJSONStringParserHandler(@JSONFromString);
|
||||
end;
|
||||
|
||||
Procedure UnHookGetJSONCallBack;
|
||||
|
||||
begin
|
||||
SetJSONParserHandler(Nil);
|
||||
SetJSONStringParserHandler(Nil);
|
||||
end;
|
||||
|
||||
initialization
|
||||
HookGetJSONCallBack;
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user