Przeglądaj źródła

* JSONPath demo

Michaël Van Canneyt 1 rok temu
rodzic
commit
c47fc710ba
1 zmienionych plików z 53 dodań i 0 usunięć
  1. 53 0
      packages/fcl-json/examples/jsonpath.pp

+ 53 - 0
packages/fcl-json/examples/jsonpath.pp

@@ -0,0 +1,53 @@
+program jsonpath;
+
+{$mode objfpc}{$h+}
+
+uses sysutils, classes,iostream,fpjson, jsonparser;
+
+Procedure Usage(Msg : String);
+
+begin
+  Writeln('Usage : jsonpath <path> [<file>]');
+  Writeln('Reads JSON from <file> or standard input if the <file> argument is not present');
+  Writeln('calculates <path> and prints path to stdout');
+  Writeln('if <path> does not exist in the JSON, null is printed');
+  Halt(Ord(Msg<>''));
+end;
+
+Var
+  S : TStream;
+  M : TMemoryStream;
+  D,P : TJSONData;
+  
+begin
+  if (ParamCount<1) then
+    Usage('Need path expression');
+  if (ParamStr(1)='-h') or (ParamStr(1)='--help') then
+    usage('');
+  if (ParamCount>1) then
+    S:=TFileStream.Create(ParamStr(2),fmOpenRead or fmShareDenyNone)
+  else
+    S:=TIOStream.Create(iosInput);
+  D:=Nil;
+  M:=Nil;
+  P:=Nil;
+  try
+    M:=TMemoryStream.Create;
+    M.CopyFrom(S,0);
+    M.Position:=0;
+    D:=GetJSON(M);
+    if D<>Nil then
+      P:=D.FindPath(ParamStr(1));
+    if Not Assigned(P) then
+      Writeln('null')
+    else  
+      if P.JSONType in [jtArray,jtObject] then
+        Writeln(P.AsJSON)
+      else
+        Writeln(P.AsString);  
+  Finally
+    M.Free;
+    S.Free;
+    D.Free;
+  end;
+end.