Convert string to JSON string



  • Hallo Leute,

    ich soll Daten als JSON-string via Socket verschicken.

    ich habe bis jetzt immer nur gefunden, wie ich ein JSON string in was auch immer reconvertiere, aber wie bekomme ich ein "c++" string in ein JSON string.

    Danke für alle hilfen

    Gruß EmbSofti



  • ich hab soeben das hier gefunden:

    http://stackoverflow.com/questions/23132621/create-a-json-array-in-c

    ich glaube, das löst mein Problem



  • Ich habe einen JSON Serialisierer, der dafür geeignet ist. Dokumentation findest Du unter http://www.tntnet.org/howto/json-howto.html.

    Ein einfacher std::string als Json ausgegeben geht so:

    std::string foo = "Hi";
    std::cout << cxxtools::Json(foo);
    

    Etwas komplexer, wie beispielsweise ein std::vectorstd::string ist hier:

    std::vector<std::string> s = { "hi", "there" };
    std::cout << cxxtools::Json(s);
    

    Für eigene Klassen kannst Du einen Serialisierer schreiben. Beispiele findest Du in der Dokumentation.

    Und eine Socket-Klasse, die das iostream-Interface implementiert ist auch da.

    Ach ja - die Bibliothek geht auf fast allen Betriebssystemen. Windows gehört aber nicht dazu. Wobei die Json-Sachen relativ leicht zu portieren wären.



  • danke für den Tipp,

    schau ich mir gleich mal an 🙂



  • tntnet schrieb:

    Ach ja - die Bibliothek geht auf fast allen Betriebssystemen. Windows gehört aber nicht dazu. Wobei die Json-Sachen relativ leicht zu portieren wären.

    Ich fände es wirklich ungemein praktisch, wenn die Bibliothek auch auf Windows laufen würde. Gibt es irgendwo eine Liste was genau dafür gemacht werden müsste o.ä. Bzw. wie groß wäre der Aufwand dafür?



  • Vielleicht nicht die Beste, aber:

    https://github.com/5cript/SimpleJSON (header only)

    Wenn man boost hat ziemlich einfach zu benutzen.
    Außer vielleicht man will tausende serialisierungen / deserialisierungen pro Sekunde machen, dafür ist die nicht geeignet.

    PS: Wenn hier schon jeder Selbstwerbung macht 😃
    PS 2: Pull requests sind willkommen 🙂

    EDIT: hmm ich muss die Doku nochmal überarbeiten die ist voll mit Fehlern (Rechtschreibung, Grammatik, Wortwahl)



  • Hallo,

    danke für die ganzen Vorschläge.

    ich weiß trotzdem nicht weiter.

    ich darf nichts externes benutzen, wie boost und das von tntnet.

    gibt es noch andere mittel und wege ein string in ein JSON string zu konvertieren ???

    EDIT:

    ich hab das folgende probiert:

    http://stackoverflow.com/questions/5078626/jsonify-string-in-c

    Problem ist nur, dass der JSON-String hinterher wie Chaos aussieht 😮 😮

    {"timestamp":1445429965,"urgent":0,"version":1}
    

    und hinterher als JSON string:

    {\u0022timestamp\u0022:1445429965,\u0022urgent\u0022:0,\u0022version\u0022:1}
    

    der ersetzt jedes " durch \u0022

    EmbSofti 🙄



  • EmbSofti schrieb:

    der ersetzt jedes " durch \u0022

    Ja und? Wie sollte das Ergebnis deiner Meinung nach aussehen?



  • so wie das oben drüber...

    mit anführungszeichen



  • Du willst den String also unverändert lassen? Das ist einfach - dazu musst du dich nur im Sessel zurücklehnen.



  • Warum benutzt du überhaupt convert_string()?

    Die ersetzt doch nur irgentwelche Sonderzeichen durch die \u... Notation!

    Definier doch einfach, dass du ASCII nutzt und gut iss.



  • diese funktion habe ich gefunden, als ich danach suchte einen string in ein JSON string zu konvertieren.

    wenn du eine bessere methode weißt, dies zu tun, kannst du die gern verraten :p



  • EmbSofti schrieb:

    diese funktion habe ich gefunden, als ich danach suchte einen string in ein JSON string zu konvertieren.

    wenn du eine bessere methode weißt, dies zu tun, kannst du die gern verraten :p

    Du behauptest einerseits, einen String in einen JSON-String konvertieren zu wollen, andererseits jammerst du, wenn genau das passiert. Du hast offenbar nicht die geringste Ahnung, was du eigentlich willst.



  • Ich glaube du verfängst dich...

    {
    "Herausgeber": "Karl Heinz"
    }

    "Herausgeber" und "Karl Heinz" sind Json Strings. Will man nun aber den String "<sensor data="1.2"/>" als Json String schreiben, musst du zwangsweise die " innerhalb des Strings ersetzen.

    {
    "Herausgeber": "<sensor data=\UXXX1.2\UXXX/>"
    }

    Da du aber anscheinend Sensordaten senden willst, sehe ich keinerlei Bedarf " innerhalb von Strings zu erlauben.



  • Bitte ein Bit schrieb:

    Da du aber anscheinend Sensordaten senden willst, sehe ich keinerlei Bedarf " innerhalb von Strings zu erlauben.

    Was ist denn das wieder für ein Kinderkram?

    Wenn ich Daten in JSON packen will, dann schreibe ich mir eine Funktion oder ein Objekt oder was auch immer, welches genau das macht. Und zwar mit allen möglichen Gänsefüsschen und Sonderzeichen. Und wenn ich wieder JSON lesen will, dann mache ich genau das umgekehrte.

    Da es recht anspruchsvoll ist, mache ich das genau ein mal im Leben. Und zwar nicht für den Sonderfall "Sensordaten" sondern eben generisch. Und weil es mir gefällt, stelle ich das auch anderen zur Verfügung.



  • Hallo tntnet,

    danke nochmal auf den Hinweis für dein Programm. 😋
    Ich werde einfach meinen Chef fragen, ob ich es nehmen kann,
    weil es sonst einfach nichts vernünftiges gibt, was genau das macht,
    was ich brauche und du es wahrscheinlich als einziger verstehst. 👍 👍

    Den anderen sei gesagt, wenn ihr keine Ahnung habt, wie ihr mir helfen könnt oder es einfach nicht versteht, warum ich das nunmal so brauch (hab es mir ja ned ausgesucht, aber mein AG will es so) - einfach Klappe halten 👎 👎 , anstatt mich hier blöde anzumachen, dass ich keine Ahnung habe und ned weiß, was ich will.

    Und das auch mit Benutzernamen, die einerseits unregistriert sind (was nicht schlecht sein muss) und zum anderen daraus bestehen, dass man einmal mit der Hand über die Tastatur streicht. 😕 😕

    Auch wenn ich hier nur eine digitale Identität habe, habe ich dennoch Respekt verdient ... 😡 😡



  • hi

    ich hab zu dem thema "c++ json" folgendes gefunden...
    hast du dir das schonmal angeschaut?
    https://msdn.microsoft.com/de-de/library/jj969455.aspx
    https://msdn.microsoft.com/de-de/library/jj950082.aspx

    ich weiß nicht ob du qt kennst vll sogar benutzt?
    dieses bietet möglichkeiten mit json umzugehen...
    http://doc.qt.io/qt-5/json.html

    hier vll noch weitere anregungen:
    http://stackoverflow.com/questions/3512650/fastest-json-reader-writer-for-c

    vll hilft dir auch das: (ist aber soweit ich gesehen hab in c)
    https://linuxprograms.wordpress.com/2010/05/20/json-c-libjson-tutorial/

    hoff ich konnte helfen 🙂
    lg



  • hallo JaaSON ,

    danke für deine ausführliche Antwort und den tollen Hilfen.

    Mit Qt hab ich bereits gearbeitet, kommt aber hier nicht zum Einsatz.
    Genauso wenig wie Visual Studio.

    Es sollte also wunderbar unter Linux laufen.

    Hast du mit einem von den anderen vielleicht bereits Berührungspunkte gehabt ?
    Fühl mich gerade ein wenig erschlagen 😮

    Und ich hab irgendwie falsch gesucht, denn ich hab nur gefunden, wie ich JSON objekte anlege und in C++ objekte konvertiere aber nie andersrum 😕

    EDIT:

    dieses jansson scheint vielversprechend zu sein,
    wenn ich das jetzt beim durchfliegen richtig gedeutet habe ?!



  • @tntnet:

    Was ist denn das wieder für ein Kinderkram?

    Nennt sich Vereinfachung, da EmbSofti da etwas verwechselt hat.

    Der Ausdruck

    {\u0022timestamp\u0022:1445429965,\u0022urgent\u0022:0,\u0022version\u0022:1}
    

    ist genauso falsch wie

    {\u0022timestamp\u0022:1445429965,\u0022urgent\u0022:0,\u0022version \u0022: 123\u0022\u0022:1}
    

    Besser wäre:

    {"timestamp":1445429965,"urgent":0,"version \u0022: 123\u0022":1}
    

    Also warum nicht in der ersten Version einfach mal das Senden von " innerhalb von String nicht unterstützen?

    Meine Lösung sagt ja nur, dass das Program innerhalb von Strings keine " sendet. Und gerade wenn EmbSofti unter Zeitdruck steht und offenbar die Syntax bzw. Grammatik nicht richtig verstanden hat. Zeitdruck ist in einigen Fällen die beste Ausrede für fürchterliche Implementierungen. Das geht in C mit einem sprintf...

    Da wäre ich zufrieden, wenn eine einigermaßen portable Lösung implementiert würde und ein enstsprechender TODO Eintrag erfolgt. Die JSON Lösung erweitern kann man später immer noch.

    Wenn ich Daten in JSON packen will, dann schreibe ich mir eine Funktion oder ein Objekt oder was auch immer, welches genau das macht. Und zwar mit allen möglichen Gänsefüsschen und Sonderzeichen. Und wenn ich wieder JSON lesen will, dann mache ich genau das umgekehrte.

    Das ist ein Streit zwischen Spezialisierung und Generalisierung.

    Da es recht anspruchsvoll ist, mache ich das genau ein mal im Leben.

    Schön wäre es, wenn es denn immer ginge.

    Und dann beschliesst man, dass das Ganze auf einem Prozessor mit 4kByte Flash laufen muss. Oder man wechselt auf ein komplizierteres Format ala DXF, welches jedes Jahr ein Update erlebt.

    EmbSofti schrieb:

    Den anderen sei gesagt, wenn ihr keine Ahnung habt, wie ihr mir helfen könnt oder es einfach nicht versteht, warum ich das nunmal so brauch (hab es mir ja ned ausgesucht, aber mein AG will es so) - einfach Klappe halten 👎 👎 , anstatt mich hier blöde anzumachen, dass ich keine Ahnung habe und ned weiß, was ich will.

    Was habe ich denn getan, um eine solche pampige Antwort zu rechtfertigen? 😡



  • EmbSofti schrieb:

    danke nochmal auf den Hinweis für dein Programm. 😋
    Ich werde einfach meinen Chef fragen, ob ich es nehmen kann,
    weil es sonst einfach nichts vernünftiges gibt, was genau das macht,
    was ich brauche und du es wahrscheinlich als einziger verstehst. 👍 👍

    Ich hoffe, du bist nicht zu sehr enttäuscht, wenn tntnets Bibliothek dir Anführungszeichen in Strings auch escaped, wie jede andere korrekt implementierte JSON-Bibliothek das auch tun würde 🙄

    EmbSofti schrieb:

    (hab es mir ja ned ausgesucht, aber mein AG will es so) - einfach Klappe halten 👎 👎 , anstatt mich hier blöde anzumachen, dass ich keine Ahnung habe und ned weiß, was ich will.

    Die normale Reaktion auf so einen Vorwurf sollte die Realisation deinerseits sein, dass du dich entweder unklar ausgedrückt hast oder vergessen hast, wichtige Details zu erwähnen und daraufhin die fehlenden Information unverzüglich nachzuliefern.

    EmbSofti schrieb:

    Auch wenn ich hier nur eine digitale Identität habe, habe ich dennoch Respekt verdient ... 😡 😡

    Wenn du Respekt verdienen willst, sag klipp und klar im ersten Post, was du hast, was du erreichen willst und was dein Problem dabei ist und antworte auf eventuelle Nachfragen. Nichts davon hast du getan. Stattdessen gibt es vage Hinweise, dass du irgendetwas mit JSON machen willst und fährst eine Hinhaltungstaktik, während jeder Thread-Teilnehmer wild spekuliert, was du denn vielleicht gemeint haben könntest. Findest du das witzig?


Log in to reply