Results 1 to 5 of 5

Thread: JSON Decode , moeilijker dan gedacht?

  1. #1

    JSON Decode , moeilijker dan gedacht?

    Hey Allen,

    ik ben wat nieuw met het gebruik van JSON in delphi maar ik raak maar niet aan een oplossing voor volgens
    mij een redelijk eenvoudige situatie :

    Ik krijg via een MQTT server volgende JSON binnen :
    Code:
    {
        "d" : {
            "PowerONOFF" : [ true ],
            "Fan" : [ 50 ],
            "ActualTemp" : [ 176 ],
            "ActualHum" : [ 91 ]
        }
    }
    Ik dacht dat ik eenvoudig de waardes ging kunnen uitlezen, maar wat ik ook probeer, ik kom er niet.

    Code:
    procedure TFormMQTT.DecodeJSON(JSON:string);
    var
        V: TJsonValue;
        O, E, P: TJsonObject;
        A: TJsonArray;
         I : Integer;
        Temp : string;
      begin
        V := TJSONObject.ParseJSONValue(JSON);
        if not Assigned(V) then
          memo1.Lines.add('Invalid JSON');
        try
          memo1.Lines.add('Incoming JSON');
          O := V as TJSONObject;
          memo1.Lines.Add('O : '+inttostr(O.Count));   -> Klopt , ik krijg '1' te zien, duidend op 1 object onder de "d"
    
          A := O.GetValue<TJsonArray>('d');     -> A blijft leeg?
    
    
          for  I := 0 to A.Count - 1 do
          begin
            E := A.Items[I] as TJsonObject; // Element
            P := E.GetValue<TJsonObject>('ActualTemp');
            Memo1.lines.add('Value: ' + P.GetValue<string>('Value') + '  ' + 'Quantity: ' +  P.GetValue<string>('Quantity'));
          end;
        finally
          V.Free;
        end;
      end;
    Met deze code krijg ik een valid JSON, maar ik krijg met geen enkele methode de values .. Iemand enig idee wat ik fout doe? Alvast bedankt.
    Last edited by bartje; 21-Apr-23 at 14:08.
    whatever you do, you've done it
    ;-)

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    "d" is een object en "PowerONOFF", "Fan", "ActualTemp" en "ActualHum" zijn arrays:

    Zo werkt het wel:
    Delphi Code:
    1. procedure TFormMQTT.DecodeJSON(AJSON: string);
    2.  
    3.   procedure PrintArray(const AName: string; const AValues: TJSONValue);
    4.   var
    5.     I: Integer;
    6.     S: string;
    7.   begin
    8.     if (AValues is TJSONArray) and
    9.        (TJSONArray(AValues).Count > 0) then
    10.     begin
    11.       S := '';
    12.       for I := 0 to Pred(TJSONArray(AValues).Count) do
    13.         if S = '' then
    14.           S := AName + ': [' + TJSONArray(AValues).Items[I].Value
    15.         else
    16.           S := S + ', ' + TJSONArray(AValues).Items[I].Value;
    17.       S := S + ']';
    18.  
    19.       Memo1.Lines.Add(S);
    20.     end;
    21.   end;
    22.  
    23. var
    24.   JSON: TJSONObject;
    25.   d: TJSONObject;
    26. begin
    27.   JSON := TJSONObject(TJSONObject.ParseJSONValue(AJSON));
    28.   try
    29.     d := TJSONObject(JSON.Values['d']);
    30.     if Assigned(d) then
    31.     begin
    32.       PrintArray('PowerONOFF', d.Values['PowerONOFF']);
    33.       PrintArray('Fan', d.Values['Fan']);
    34.       PrintArray('ActualTemp', d.Values['ActualTemp']);
    35.       PrintArray('ActualHum', d.Values['ActualHum']);
    36.     end;
    37.   finally
    38.     JSON.Free;
    39.   end;
    40. end;
    Last edited by VideoRipper; 21-Apr-23 at 17:24.
    TMemoryLeak.Create(Nil);

  3. #3
    En dit was out of the box meteen een succes !

    Hartelijk dank !!
    whatever you do, you've done it
    ;-)

  4. #4
    Wel een vreemde structuur. Geen idee waarom alles in arrays staat..
    1+1=b

  5. #5
    Ja dat was inderdaad niet nodig en gebruik ik ook niet. Maar het ging hem over het distilleren van de JSON.
    whatever you do, you've done it
    ;-)

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •