AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

google Api Json und Umlaute

Ein Thema von stefan684 · begonnen am 14. Jun 2024 · letzter Beitrag vom 17. Jun 2024
Antwort Antwort
stefan684

Registriert seit: 28. Mai 2013
14 Beiträge
 
Delphi 10.3 Rio
 
#1

google Api Json und Umlaute

  Alt 14. Jun 2024, 13:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: google Api Json und Umlaute

  Alt 14. Jun 2024, 14:09
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
stefan684

Registriert seit: 28. Mai 2013
14 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: google Api Json und Umlaute

  Alt 17. Jun 2024, 07:11
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);
  Mit Zitat antworten Zitat
stefan684

Registriert seit: 28. Mai 2013
14 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: google Api Json und Umlaute

  Alt 17. Jun 2024, 09:33
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: google Api Json und Umlaute

  Alt 17. Jun 2024, 10:07
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
stefan684

Registriert seit: 28. Mai 2013
14 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: google Api Json und Umlaute

  Alt 17. Jun 2024, 10:12
Hallo Uwe,

hat funktoniert.

Vielen Dank!
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz