33 Stimmen

Gibt es eine Standardzuordnung zwischen JSON und Protokollpuffern?

Aus einem Kommentar auf der Ankündigung Blog Post :

Bezüglich JSON: JSON ist ähnlich strukturiert ähnlich wie Protokollpuffer, aber Protokollpuffer-Binärformat ist noch kleiner und schneller zu kodieren. JSON ist eine hervorragende Textkodierung für Protokollpuffer, obwohl es trivial ist ist es trivial, einen Encoder/Decoder zu schreiben zu schreiben, der beliebige Protokoll Nachrichten nach und von JSON konvertiert, indem man protobuf-Reflexion. Dies ist ein guter Weg, um mit AJAX-Anwendungen zu kommunizieren, denn der Benutzer muss einen vollständigen protobuf decoder herunterzuladen, wenn er Ihre Seite herunterzuladen, könnte zu viel sein.

Es mag trivial sein, etwas zu kochen a Mapping, aber gibt es ein einziges "offensichtliches" Mapping zwischen den beiden, auf das sich zwei getrennte Entwicklungsteams natürlich einigen würden? Wenn zwei Produkte PB-Daten unterstützen und interoperabel sind, weil sie dieselbe .proto-Spezifikation verwenden, frage ich mich, ob sie immer noch interoperabel wären, wenn sie unabhängig voneinander eine JSON-Reflexion derselben Spezifikation einführen würden. Es könnten einige willkürliche Entscheidungen getroffen werden, z.B. sollten Enum-Werte durch eine Zeichenkette repräsentiert werden (um für den Menschen lesbar zu sein, wie typisches JSON) oder durch ihren Integer-Wert?

Also gibt es eine etablierte Zuordnung, und alle Open-Source-Implementierungen für die Generierung von JSON-Encoder/Decoder aus .proto Spezifikationen?

8voto

Aravind Yarram Punkte 76365

Vielleicht ist dies hilfreich http://code.google.com/p/protobuf-java-format/

8voto

Erik Sjölund Punkte 9620

Ja, seit Protokollpuffer Version 3.0.0 (veröffentlicht am 28. Juli 2016) gibt es ist "Eine wohldefinierte Kodierung in JSON als Alternative zur binären Proto Kodierung" wie in den Versionshinweisen erwähnt

https://github.com/google/protobuf/releases/tag/v3.0.0

6voto

StaxMan Punkte 107669

Nach dem, was ich gesehen habe, Protostoffe ist das Projekt, das für alle PB-Arbeiten in Java verwendet werden sollte, einschließlich der Serialisierung als JSON, basierend auf der Protokolldefinition. Ich habe es nicht selbst verwendet, habe nur Gutes gehört.

2voto

Kirby Punkte 14142

Ich brauchte, um von GeneratedMessageLite zu einem JSON-Objekt zu marschieren, aber nicht zu unmarshal. Ich konnte die protobuf-Bibliothek in der Antwort von Pangea nicht verwenden, weil sie nicht mit der Option LITE_RUNTIME funktioniert. Außerdem wollte ich unser bereits umfangreiches Legacy-System nicht mit der Generierung von mehr kompiliertem Code für die vorhandenen Protokollpuffer belasten. Für das Mashalling nach JSON habe ich mich für diese einfache Lösung zum Marshalling entschieden

    final Person gpb = Person.newBuilder().setName("Bill Monroe").build();
    final Gson gson = new Gson();
    final String jsonString = gson.toJson(gpb);

1voto

StaxMan Punkte 107669

Ein weiterer Gedanke: Wenn protobuf-Objekte Getter/Setter oder entsprechend benannte Felder haben, könnte man einfach verwenden Jackson die Datenbindung des JSON-Prozessors. Standardmäßig werden öffentliche Getter, beliebige Setter und öffentliche Felder behandelt, aber dies sind nur Standard-Sichtbarkeitsstufen und können geändert werden. Wenn dies der Fall ist, kann Jackson protobuf generierte POJOs ohne Probleme serialisieren/deserialisieren.

Das Einzige, was ich dort konfigurieren musste, war, die Serialisierung der verschiedenen "isXXX()"-Methoden zu deaktivieren, die Thrift hinzufügt, um zu prüfen, ob ein Feld explizit zugewiesen wurde oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X