AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Json auf Gleichheit prüfen

Ein Thema von Der schöne Günther · begonnen am 10. Nov 2017 · letzter Beitrag vom 10. Nov 2017
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Json auf Gleichheit prüfen

  Alt 10. Nov 2017, 14:53
Ja, A und B sind gleich wenn A eine Teilmenge von B und B eine Teilmenge von A ist.

Oder wie der Mathematiker sagen würde:

A=B :⇔ ∀x (x∈A⇔x∈B)


Aber wir müssen hier nicht weiterbohren. Ich bin heute faul. Wenn es etwas fertiges gegeben hätte, dann hätte ich es eingesetzt. Da es nichts gibt, lasse ich die Prüfung ob sie gleich sind halt unter den Tisch fallen...
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Json auf Gleichheit prüfen

  Alt 10. Nov 2017, 15:14
Ich war mal so frei. Vergleicht die trivialen Typen allerdings als Strings, wo ich mir nicht sicher bin, ob z.b. JSON für Floats einen einheitlichen DecimalSeperator spezifiziert. Die umgekehrte Prüfung konnte man sich doch sparen, indem man vorher die Anzahl der Elemente vergleicht.

Delphi-Quellcode:
type
  TJSONType = (
    jsonInvalid,
    jsonInteger,
    jsonFloat,
    jsonString,
    jsonBoolean,
    jsonArray,
    jsonObject,
    jsonNull
  );

  TJSONHelper = record
  public
    class function ValueType(Value: TJSONValue): TJSONType; static;
    class function Equals(A, B: TJSONValue): Boolean; static;
  end;

class function TJSONHelper.ValueType(Value: TJSONValue): TJSONType;
begin
  Result := TJSONType.jsonInvalid;
  if (Value is TJSONNumber) then
  begin
    if (Value.ToString.Contains(GetJSONFormat.DecimalSeparator)) then
    begin
      Result := TJSONType.jsonFloat;
    end else
    begin
      Result := TJSONType.jsonInteger;
    end;
  end else
  if (Value is TJSONString) then
  begin
    Result := TJSONType.jsonString;
  end else
  if (Value is TJSONBool) then
  begin
    Result := TJSONType.jsonBoolean;
  end else
  if (Value is TJSONArray) then
  begin
    Result := TJSONType.jsonArray;
  end else
  if (Value is TJSONObject) then
  begin
    Result := TJSONType.jsonObject;
  end else
  if (Value is TJSONNull) then
  begin
    Result := TJSONType.jsonNull;
  end;
end;

class function TJSONHelper.Equals(A, B: TJSONValue): Boolean;
var
  T: TJSONType;
  I: Integer;
  AA, AB: TJSONArray;
  OA, OB: TJSONObject;
  P: TJSONPair;
  V: TJSONValue;
begin
  Result := true;
  T := ValueType(A);
  if (T <> ValueType(B)) then
  begin
    Exit(false);
  end;
  case T of
    jsonArray:
      begin
        AA := A as TJSONArray;
        AB := B as TJSONArray;
        if (AA.Count <> AB.Count) then
        begin
          Exit(false);
        end;
        for I := 0 to AA.Count - 1 do
        begin
          if (not Equals(AA.Items[I], AB.Items[I])) then
          begin
            Exit(false);
          end;
        end;
        Exit;
      end;
    jsonObject:
      begin
        OA := A as TJSONObject;
        OB := B as TJSONObject;
        if (OA.Count <> OB.Count) then
        begin
          Exit(false);
        end;
        for I := 0 to OA.Count - 1 do
        begin
          P := OA.Pairs[I];
          V := OB.Values[P.JsonString.Value];
          if (not Equals(P.JsonValue, V)) then
          begin
            Exit(false);
          end;
        end;
        Exit;
      end;
  end;
  if (A.Value <> B.Value) then
  begin
    Exit(false);
  end;
end;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (10. Nov 2017 um 15:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#3

AW: Json auf Gleichheit prüfen

  Alt 10. Nov 2017, 19:54
Alternativ erstmal die Elemente der Objekte sortieren und dann vergleichen.

Und nein, bei Objekten kommt es manchmal doch auf die Reihenfolge an, wenn man das auf Property bezieht,
vorallem wenn sich ein Property auf andere Property auswirkt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz