proto3 JSON serializer for TypeScript / JavaScript
This library implements proto3 JSON serialization and deserialization for
protobuf.js protobuf objects
according to the spec.
Note that the spec requires special representation of some google.protobuf.*
types
(Value
, Struct
, Timestamp
, Duration
, etc.), so you cannot just use .toObject()
since the result won't be understood by protobuf in other languages. Hence this module.
JavaScript:
const serializer = require('proto3-json-serializer');
TypeScript:
import * as serializer from 'proto3-json-serializer';
Serialization: protobuf.js object to proto3 JSON
const root = protobuf.loadSync('test.proto');
const Type = root.lookupType('test.Message');
const message = Type.fromObject({...});
const serialized = serializer.toProto3JSON(message);
Serialization works with any object created by calling .create()
, .decode()
, or .fromObject()
for a loaded protobuf type. It relies on the $type
field so it will not work with a static object.
Deserialization: proto3 JSON to protobuf.js object
To deserialize an object from proto3 JSON, we must know its type (as returned by root.lookupType('...')
).
Pass this type as the first parameter to .fromProto3JSON
:
const root = protobuf.loadSync('test.proto');
const Type = root.lookupType('test.Message');
const json = {...};
const deserialized = serializer.fromProto3JSON(Type, json);
Complete example
const assert = require('assert');
const path = require('path');
const protobuf = require('protobufjs');
const serializer = require('proto3-json-serializer');
const protos = require('google-proto-files');
const rpcProtos = protos.getProtoPath('rpc');
const root = protobuf.loadSync([
path.join(rpcProtos, 'status.proto'),
path.join(rpcProtos, 'error_details.proto'),
]);
const Status = root.lookupType('google.rpc.Status');
const json = {
code: 3,
message: 'Test error message',
details: [
{
'@type': 'google.rpc.BadRequest',
fieldViolations: [
{
field: 'field',
description: 'must not be null',
},
],
},
],
};
const deserialized = serializer.fromProto3JSON(Status, json);
console.log(deserialized);
const serialized = serializer.toProto3JSON(deserialized);
assert.deepStrictEqual(serialized, json);
Disclaimer
This is not an officially supported Google project.