Advertisement
Guest User

Untitled

a guest
Apr 4th, 2015
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.13 KB | None | 0 0
  1. unit JsonObject;
  2.  
  3. interface
  4.  
  5. uses
  6.   System.SysUtils, Generics.Collections;
  7.  
  8. type
  9.   TJsonType = ( jntBoolean,
  10.                 jntInteger,
  11.                 jntString );
  12.  
  13.   TJsonValue = class
  14.   private
  15.     FValue : string;
  16.     function FGetType : TJsonType;
  17.   public
  18.     procedure GetValue(var AOutput : boolean); overload;
  19.     procedure GetValue(var AOutput : integer); overload;
  20.     procedure GetValue(var AOutput : string); overload;
  21.  
  22.     procedure Assign(AValue : string);
  23.     property ValueType : TJsonType read FGetType;
  24.   end;
  25.  
  26.  
  27.   TJsonNodes = class
  28.   protected
  29.     FKeyList : TList<string>;
  30.     FValues : TDictionary<string, TJsonValue>;
  31.     function FGetValue(Index : string) : TJsonValue;
  32.   public
  33.     constructor Create();
  34.     procedure AddItem(AKey : string); overload;
  35.     procedure AddItem(AKey : string; AValue : TJsonValue); overload;
  36.     property KeyList : TList<string> read FKeyList;
  37.     property Value[Index : string] : TJsonValue read FGetValue; default;
  38.   end;
  39.  
  40.  
  41.  
  42.   TJsonParser = class(TJsonNodes)
  43.   private
  44.   protected
  45.     FJson : string;
  46.   public
  47.     constructor Create();
  48.     procedure Assign(AJson : string);
  49.     procedure Parse(AJson : string); overload;
  50.     procedure Clear();
  51.     procedure Parse(); overload;
  52.     property Json : string read FJson;
  53.   end;
  54.  
  55. implementation
  56.  
  57. { TJsonParser }
  58.  
  59. procedure TJsonParser.Assign(AJson: string);
  60. begin
  61.   FJson := AJson;
  62. end;
  63.  
  64. procedure TJsonParser.Parse(AJson: string);
  65. begin
  66.   FJson := AJson;
  67.   Parse();
  68. end;
  69.  
  70. procedure TJsonParser.Clear;
  71. var
  72.   CurrentCharIndex: Integer;
  73.   CurrentChar : char;
  74.   OutputString : string;
  75.   InString : boolean;
  76. begin
  77.   InString := False;
  78.  
  79.   for CurrentCharIndex := 1 to Length(FJson) do
  80.   begin
  81.     CurrentChar := FJson[CurrentCharIndex];
  82.  
  83.     if (CurrentChar = '"') then
  84.       InString := not InString;
  85.  
  86.     if ((CurrentChar = ' ') and (InString = false)) or
  87.        ((CurrentChar = #10) or (CurrentChar = #13)) then
  88.       Continue;
  89.  
  90.     OutputString := OutputString + CurrentChar;
  91.   end;
  92.   FJson := OutputString;
  93. end;
  94.  
  95. constructor TJsonParser.Create;
  96. begin
  97.   inherited Create;
  98.  
  99. end;
  100.  
  101. procedure TJsonParser.Parse;
  102. var
  103.   CurrentCharIndex: Integer;
  104.   CurrentChar : char;
  105.  
  106.   LineStarted : boolean;
  107.  
  108.   IndexDone : boolean;
  109.   InIndex : boolean;
  110.  
  111.   InValue : boolean;
  112.   ValueDone : Boolean;
  113.  
  114.   InString : boolean;
  115.  
  116.   LJsonValue : TJsonValue;
  117.  
  118.   StringBuffer : string;
  119.  
  120.   LastAdded : string;
  121.   LastChar : char;
  122. begin
  123.   Clear;
  124.  
  125.   LineStarted := false;
  126.  
  127.   IndexDone := false;
  128.   InIndex := false;
  129.  
  130.   InValue := false;
  131.   ValueDone := false;
  132.  
  133.   InString := False;
  134.  
  135.   for CurrentCharIndex := 1 to Length(FJson) do
  136.   begin
  137.     CurrentChar := FJson[CurrentCharIndex];
  138.     LastChar := FJson[CurrentCharIndex-1];
  139.  
  140.  
  141.    if (CurrentChar = ',') or (CurrentChar = '}') then
  142.     begin
  143.       if InString then
  144.         raise Exception.Create('String should be ended')
  145.       else if InIndex then
  146.         raise Exception.Create('Index should be ended')
  147.       else if IndexDone and not ValueDone then
  148.         raise Exception.Create('Value should be setted')
  149.       else
  150.       begin
  151.         LineStarted := false;
  152.  
  153.         IndexDone := false;
  154.         InIndex := false;
  155.  
  156.         InValue := false;
  157.         ValueDone := false;
  158.  
  159.         InString := False;
  160.  
  161.  
  162.         Value[LastAdded].Assign(StringBuffer);
  163.  
  164.             StringBuffer := '';
  165.             InValue := false;
  166.  
  167.         StringBuffer := '';
  168.       end;
  169.     end;
  170.  
  171.  
  172.     if not LineStarted then
  173.     begin
  174.       if CurrentChar = '"' then
  175.       begin
  176.         InIndex := true;
  177.         LineStarted := true;
  178.  
  179.         LJsonValue := TJsonValue.Create;
  180.  
  181.         Continue;
  182.       end;
  183.     end;
  184.  
  185.     if LineStarted then
  186.     begin
  187.       if (InIndex) and (not InValue) then
  188.       begin
  189.         if not(CurrentChar = '"') then
  190.         begin
  191.           StringBuffer := StringBuffer + CurrentChar;
  192.           Continue;
  193.         end
  194.         else
  195.         begin
  196.           InIndex := false;
  197.           AddItem(StringBuffer, LJsonValue);
  198.           LastAdded := StringBuffer;
  199.           StringBuffer := '';
  200.           Continue;
  201.         end;
  202.       end
  203.       else if (not InIndex) and (not InValue) then
  204.       begin
  205.         if CurrentChar = ':' then
  206.         begin
  207.           InValue := true;
  208.           Continue;
  209.         end;
  210.       end
  211.       else if (not InIndex) and (InValue) then
  212.       begin
  213.         StringBuffer := StringBuffer + CurrentChar;
  214.  
  215.         if (not(StringBuffer = '')) and
  216.            (CurrentChar = '"') and
  217.            (LastChar = '"') then
  218.            raise Exception.Create('"," expected.');
  219.  
  220.  
  221.       end;
  222.  
  223.     end;
  224.  
  225.  
  226.   end;
  227. end;
  228.  
  229. { TJsonValue }
  230.  
  231. procedure TJsonValue.Assign(AValue: string);
  232. begin
  233.   FValue := AValue;
  234. end;
  235.  
  236. function TJsonValue.FGetType: TJsonType;
  237. var
  238.   LInt : integer;
  239. begin
  240.   if (FValue = 'true') or
  241.      (FValue = 'false') then
  242.      Result := jntBoolean
  243.   else if (FValue[1] = '"') and
  244.           (FValue[Length(FValue)] = '"') then
  245.      Result := jntString
  246.   else
  247.   begin
  248.     try
  249.       LInt := StrToInt(FValue);
  250.     finally
  251.       Result := jntInteger;
  252.     end;
  253.   end;
  254.  
  255.  
  256.  
  257. end;
  258.  
  259. procedure TJsonValue.GetValue(var AOutput: boolean);
  260. begin
  261.   if (FValue = 'true') then
  262.     AOutput := True
  263.   else if (FValue = 'false') then
  264.     AOutput := false
  265.   else
  266.     raise Exception.Create(FValue + ' is no Boolean');
  267. end;
  268.  
  269. procedure TJsonValue.GetValue(var AOutput: integer);
  270. begin
  271.   AOutput := StrToInt(FValue);
  272. end;
  273.  
  274. procedure TJsonValue.GetValue(var AOutput: string);
  275. begin
  276.   if (FValue[1] = '"') and
  277.      (FValue[Length(FValue)] = '"') then
  278.      AOutput := Copy(FValue, 2, Length(FValue)-2);
  279. end;
  280.  
  281. { TJsonNodes }
  282.  
  283. procedure TJsonNodes.AddItem(AKey: string);
  284. begin
  285.   AddItem(AKey, TJsonValue.Create);
  286. end;
  287.  
  288. procedure TJsonNodes.AddItem(AKey: string; AValue: TJsonValue);
  289. begin
  290.   FKeyList.Add(AKey);
  291.   FValues.Add(AKey, AValue);
  292. end;
  293.  
  294. constructor TJsonNodes.Create;
  295. begin
  296.   FKeyList := TList<string>.Create;
  297.   FValues := TDictionary<string, TJsonValue>.Create();
  298. end;
  299.  
  300. function TJsonNodes.FGetValue(Index: string): TJsonValue;
  301. begin
  302.   Result := FValues[Index];
  303. end;
  304.  
  305. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement