![]() |
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:
Das übermitteln an die Api mache ich so:
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;
Delphi-Quellcode:
An welcher Stelle fehlt da noch eine Konvertierung, damit mir der Straßename richtig angezeigt wird?
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; Vielen Dank. |
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.
|
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); |
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; |
AW: google Api Json und Umlaute
Versuche mal folgendes: Verzichte auf Buf, deklariere DataOut als TStringStream und ersetze diese Zeilen
Delphi-Quellcode:
mit dieser
DataOut := TMemoryStream.Create; { For the data to be sent }
DataOut.Write(Buf[1], Length(Buf));
Delphi-Quellcode:
Alternativ könntest du auch Buf als UTF8String deklarieren, aber ich finde die explizite Angabe des Encoding in diesem Ansatz leichter les- und wartbar.DataOut := TStringStream.Create(StringWriter.ToString, TEncoding.UTF8, False); { For the data to be sent } |
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