AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke JSON mit Indy verschicken -> Fehler

JSON mit Indy verschicken -> Fehler

Ein Thema von Crocotronic · begonnen am 20. Feb 2015 · letzter Beitrag vom 2. Jan 2018
Antwort Antwort
michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#1

AW: JSON mit Indy verschicken -> Fehler

  Alt 2. Jan 2018, 13:06
Hallo,

sorry, wenn ich das Thema noch mal aufreisse, ich habe aktuell ein ähnliches Problem. Ich bekomme beim Versenden von Pushnachrichten per FCM einen "json parse error: unexcepted Character at ...". Das ist immer der erste Buchstabe des Parameters aMessage. Das Problem tritt auf, sobald mindestens ein Leerzeichen in der Message ist.

Schicke ich "Bitte ruf mal an", kommt der Fehler mit Hinweis auf den Buchstaben B.
Schicke ich "Bitterufmalan" oder "Bitte_ruf_mal_an", kommt kein Fehler und die Nachricht geht einwandfrei durch.

Meine Vermutung: Es muss irgendwas mit der Codierung der Zeichen zu tun haben. Aber ich steh hier seit heute morgen mit einem Brett vorm Kopf. Das kann nur eine Kleinigkeit sein, aber ich sehe sie nicht.

Noch ein Hinweis: Von der Firebase-Console kommen Pushnachrichten einwandfrei in meiner App an, auch wenn sie Leerzeichen beinhalten.

Hier der Quelltext der kleinen Funktion:

Code:
function PushSend(aToDeviceToken:String;aNick:String;aMessage:String):Boolean;
var
  idHTTP:tIdHTTP;
  IdIOHandler:TIdSSLIOHandlerSocketOpenSSL;
  jSonString:String;
  jSonToSend:tStringStream;
  response:String;
begin
  result:=True;
  IdHTTP := TIdHTTP.Create(nil);
  try
    IdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
    IdIOHandler.SSLOptions.Method := sslvSSLv23;
    IdHTTP.Request.BasicAuthentication:=False;

    IdHTTP.IOHandler := IdIOHandler;

    IdHTTP.Request.ContentType := 'application/json';
    IdHTTP.Request.Charset := 'UTF-8';
    IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'key='+MG_SERVERKey;

    jsonString := '{"to" : "'+atoDeviceToken+'",' +
                   '"data" : {' +
                   '"nick" : "'+aNick+'",' +
                   '"body" : "'+aMessage+'",' +
                   '"room" : "Testraum"' +
                   '},}';

    JsonToSend := TStringStream.Create(jsonString,TEncoding.UTF8);
    try
      response := IdHTTP.Post('https://fcm.googleapis.com/fcm/send', JsonToSend);
      response := response.Replace(#10, '');
    except
      on E: EIdHTTPProtocolException do begin
        response := e.ErrorMessage;
        result:=false;
      end;
    end;
    showmessage('Response:'+response);
  finally
    IdHTTP.Free;
  end;
Ich habe
Code:
ContentEncoding='utf-8';
auch bereits mal gesetzt.

Und ich habe den Stringstream auch schon durch einen tStream ersetzt und bin genauso vorgegangen wie in dem vorangegangenen Post. Trotzdem kommt der Fehler immer, sobald in der Message ein Leerzeichen ist.

Kann mir jemand einen Schups geben?
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: JSON mit Indy verschicken -> Fehler

  Alt 2. Jan 2018, 13:25
Aufgrund des Syntax-Fehlers (letzte Zeile des Strings) wundert es mich dass das überhaupt durchkommt.

PS: Geh doch mal mit dem Debugger durch, was wirklich konkret in deinen Variablen drin steht. Ich würde so ein Json-Objekt echt nicht per Hand durch Strings zusammenbauen sondern das mit uses System.Json machen, da muss man sich um das Maskieren von Sonderzeichen in Strings auch nicht mehr kümmern.
  Mit Zitat antworten Zitat
michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#3

AW: JSON mit Indy verschicken -> Fehler

  Alt 2. Jan 2018, 14:19
Du meinst das Komma, ok, hab ich rausgenommen. Daran lag es nicht, das hat er tatsächlich gefressen.

Ich hab den Fehler gefunden, aMessage wurde komischerweise bereits mit Anführungszeichen übergeben, so stand im json dann

"body" : ""Bitte ruf mal an""

Die Message kam aus einem tMemo. Ich hatte den Inhalt unüblicherweise mit eMemo.lines.commatext ausgelesen und der fügt wohl selbst Anführungszeichen dazu, wenn Leerzeichen im String sind. War mir auch neu, aber ein blöder Nebeneffekt, der dann die Ursache für den Fehler war. Hab mir den Inhalt zig mal angesehen und immer übersehen.

Die Funktion ansich ist also völlig ok. Danke für die Hilfe und sorry.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: JSON mit Indy verschicken -> Fehler

  Alt 2. Jan 2018, 15:40
.CommaText nutzt .DelimitedText und das achtet auf die Einstellung von .StrictDelimiter, was bei dir besser True sein sollte.
Denn standardmäßig reagiert .DelimitedText nicht nur auf das DelimiterChar, sondern auch auf #1 bis ' ' und somit werden diese Zeichen standardmäßig ebenfalls gequotet.

Wie auch beim manuellen Zusammenbauen von SQL-Queries würde ich davon abraten das " hart im Text einzubauen und stattdessen Delphi-Referenz durchsuchenQuoteString die passende Quote-Funktion zu benutzen. (eine, welche nach der Syntax von C-Strings quoted und nicht wie QuoteString nach der Syntax von Pascal)

Oder du machst es gleich richtig und nutzt parametrisierte Funktionen, also eine JSON-Klasse, um damit den JSON-String zu generieren.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#5

AW: JSON mit Indy verschicken -> Fehler

  Alt 2. Jan 2018, 18:24
Hmm..

und wenn doch ein " im Text sein soll, dann muss der Escaped werden, wie auch einige andere Zeichen!

Unten auf
https://www.json.org/

sind die Zeichen aufgelistet!
  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 18:35 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