Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   google Api Json und Umlaute (https://www.delphipraxis.net/215335-google-api-json-und-umlaute.html)

stefan684 14. Jun 2024 12:57

google Api Json und Umlaute
 
Hallo,

ich habe folgendes Problem:

Ich sende eine Adresse zur Überprüfung an eine Google-Api im Json-Format:

{
"address": {
"regionCode": "DE",
"addressLines": [
"Seestraße",
"77694 Kehl"
]
}
}

Als Antwort erhalte ich (nur ein Ausschnitt):

},
"address": {
"formattedAddress": "Seestra e, 77694 Kehl, Deutschland",


So baue ich den Json-String zusammen:

Delphi-Quellcode:
  StringWriter := TStringWriter.Create();
  Writer := TJsonTextWriter.Create(StringWriter);
  Writer.Formatting := TJsonFormatting.Indented;

  Writer.WriteStartObject;
  Writer.WritePropertyName('address');
  Writer.WriteStartObject;
  Writer.WritePropertyName('regionCode');
  Writer.WriteValue('DE');
  Writer.WritePropertyName('addressLines');
  Writer.WriteStartArray;
  S := 'Seestraße';
  Writer.WriteValue(S);
  Writer.WriteValue('77694 Kehl');
  Writer.WriteEndArray;
  Writer.WriteEndObject;
  Writer.WriteEndObject;
Das übermitteln an die Api mache ich so:

Delphi-Quellcode:
  try
    SslHttp.URL := Url;
    SslHttp.ContentTypePost := 'application/json';
    SslHttp.SendStream := DataOut;
    SslHttp.RcvdStream := DataIn;
    SslHttp.Post;
  except
    on e:Exception do
    begin
      ReadError := True;
      ShowMessageFmt ('Error: %s', [e.Message]);
    end;
  end;
An welcher Stelle fehlt da noch eine Konvertierung, damit mir der Straßename richtig angezeigt wird?

Vielen Dank.

Uwe Raabe 14. Jun 2024 13:09

AW: google Api Json und Umlaute
 
Ich sehe jetzt noch nicht, wie aus dem Writer das DataOut wird. Irgendwo muss ja noch ein TEncoding.UTF8 kommen, aber ich sehe nicht die Stelle wo das passieren könnte.

stefan684 17. Jun 2024 06:11

AW: google Api Json und Umlaute
 
Mein Fehler:

Delphi-Quellcode:
  Buf := StringWriter.ToString;

  DataIn := TMemoryStream.Create; { For the response       }
  DataOut := TMemoryStream.Create; { For the data to be sent }

  DataOut.Write(Buf[1], Length(Buf));
  DataOut.Seek(0, soFromBeginning);

stefan684 17. Jun 2024 08:33

AW: google Api Json und Umlaute
 
Vielleicht ist es am besten, den ganzen Code zu zeigen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var  ReadError : Boolean;
      url : UTF8String;
      n,i : integer;
      Writer: TJsonTextWriter;
      Reader: TJsonTextReader;
      StringWriter: TStringWriter;
      DataIn : TMemoryStream;
      DataOut : TMemoryStream;
      Buf    : AnsiString;
      ResultString : TStringList;
      Root: TRoot;
      S : String;

begin

  StringWriter := TStringWriter.Create();
  Writer := TJsonTextWriter.Create(StringWriter);
  Writer.Formatting := TJsonFormatting.Indented;

  Writer.WriteStartObject;
  Writer.WritePropertyName('address');
  Writer.WriteStartObject;
  Writer.WritePropertyName('regionCode');
  Writer.WriteValue('DE');
  Writer.WritePropertyName('addressLines');
  Writer.WriteStartArray;
  S := 'Seestraße';
  Writer.WriteValue(S);
  Writer.WriteValue('77694 Kehl');
  Writer.WriteEndArray;
  Writer.WriteEndObject;
  Writer.WriteEndObject;

  Memo1.Text := StringWriter.ToString;
  Buf := StringWriter.ToString;

  ReadError := False;

  url := 'https://addressvalidation.googleapis.com/v1:validateAddress?key=XXXX';

  DataIn := TMemoryStream.Create; { For the response       }
  DataOut := TMemoryStream.Create; { For the data to be sent }

  DataOut.Write(Buf[1], Length(Buf));
  DataOut.Seek(0, soFromBeginning);

  try
    SslHttp.URL := Url;
    SslHttp.ContentTypePost := 'application/json';
    SslHttp.SendStream := DataOut;
    SslHttp.RcvdStream := DataIn;
    SslHttp.Post;
  except
    on e:Exception do
    begin
      ReadError := True;
      ShowMessageFmt ('Error: %s', [e.Message]);
    end;
  end;


  if not ReadError then begin
    DataIn.Seek(0, 0);
    ResultString := TStringList.Create;
    ResultString.LoadFromStream(DataIn);
    Memo1.Lines.Add(ResultString.Text);

    Root := TRoot.Create;
    Root.AsJson := ResultString.Text;
    Memo1.Lines.Add(Root.Result.Address.PostalAddress.PostalCode);
    Memo1.Lines.Add(Root.Result.Address.FormattedAddress);

    ResultString.Free;
  end;

  DataIn.Free;
  DataOut.Free;
end;

Uwe Raabe 17. Jun 2024 09:07

AW: google Api Json und Umlaute
 
Versuche mal folgendes: Verzichte auf Buf, deklariere DataOut als TStringStream und ersetze diese Zeilen
Delphi-Quellcode:
  DataOut := TMemoryStream.Create; { For the data to be sent }

  DataOut.Write(Buf[1], Length(Buf));
mit dieser
Delphi-Quellcode:

  DataOut := TStringStream.Create(StringWriter.ToString, TEncoding.UTF8, False); { For the data to be sent }
Alternativ könntest du auch Buf als UTF8String deklarieren, aber ich finde die explizite Angabe des Encoding in diesem Ansatz leichter les- und wartbar.

stefan684 17. Jun 2024 09:12

AW: google Api Json und Umlaute
 
Hallo Uwe,

hat funktoniert.

Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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