ProtoBufJsonConverter

Convert a protobuf message to a JSON string or object using the proto definition file.

MIT License

Stars
4
Committers
1

ProtoBufJsonConverter

This project uses protobuf-net to:

  • Convert a protobuf message to a JSON string using the proto definition file.
  • Convert a protobuf message to an object using the proto definition file.
  • Convert a JSON string or an object to a protobuf message using the proto definition file.

NuGet

Usage

Proto Definition

syntax = "proto3";

// Package name
package greet;

// The greeting service definition.
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

1️⃣ Convert ProtoBuf byte[] to a JSON string

---
title: "Convert ProtoBuf byte[] to a JSON string"
---
flowchart LR
	Def["ProtoBuf Definition\n(.proto)"] --> protobuf_net["protobuf-net:\n\nGenerate C# code"]
	Bytes["ProtoBuf bytes"] --> Des["protobuf-net:\n\nDeserialize ProtoBuf bytes to instance\n(using the MessageType\nand the object-type)"]
        MessageType["Message Type"] --> Des 
	protobuf_net --> CodeCompile["Compile C# code\nto Assembly"]
	CodeCompile --> CodeType["typeof(object)"]
        CodeType --> Des
	Des --> JSON2OBJ["Serialize instance\nto JSON"]

Code

var protoDefinition = "...". // See above

var bytes = Convert.FromBase64String("CgRzdGVm");

var request = new ConvertToJsonRequest(protoDefinition, "greet.HelloRequest", bytes);

var converter = new Converter();

var json = await converter.ConvertAsync(request);

JSON

{"name":"stef"}

2️⃣ Convert ProtoBuf byte[] to an object

Code

var protoDefinition = "...". // See above

var bytes = Convert.FromBase64String("CgRzdGVm");

var request = new ConvertToObjectRequest(protoDefinition, "greet.HelloRequest", bytes);

var converter = new Converter();

var @object = await converter.ConvertAsync(request);

3️⃣ Convert JSON string to a ProtoBuf byte[]

Code

var protoDefinition = "...". // See above

var json = @"{""name"":""stef""}";

var request = new ConvertToProtoBufRequest(protoDefinition, "greet.HelloRequest", json);

var converter = new Converter();

var protobuf = await converter.ConvertAsync(request);

4️⃣ Convert any object to a ProtoBuf byte[]

---
title: "Convert an object to a ProtoBuf byte[]"
---
flowchart LR
	Def["ProtoBuf Definition\n(.proto)"] --> protobuf_net["protobuf-net:\n\nGenerate C# code"]
        protobuf_net --> CodeCompile["Compile C# code\nto Assembly"]
        CodeCompile --> CodeType["typeof(object)"]
        CodeType --> Ser
	Object["Object"] --> OBJ2JSON["Serialize object\nto JSON"]
        OBJ2JSON --> JSON2INS["Deserialize JSON to instance\n(using the object-type)"]
        JSON2INS --> Ser["protobuf-net:\n\nSerialize instance to ProtoBuf bytes\n(using the MessageType)"]
        MessageType["Message Type"] --> Ser

Code

var protoDefinition = "...". // See above

var obj = new
{
    name = "stef"
};

var request = new ConvertToProtoBufRequest(protoDefinition, "greet.HelloRequest", obj);

var converter = new Converter();

var protobuf = await converter.ConvertAsync(request);

5️⃣ Convert any object to a ProtoBuf byte[] including the Grpc Header

Code

var protoDefinition = "...". // See above

var obj = new
{
    name = "stef"
};

var request = new ConvertToProtoBufRequest(protoDefinition, "greet.HelloRequest", obj)
    .WithGrpcHeader();

var converter = new Converter();

var protobufWithGrpcHeader = await ConvertAsync.Convert(request);

Using in Blazor WebAssembly

In order to use this library in a Blazor WebAssembly application, you need to provide a specific Blazor implementation for the IMetadataReferenceService, the BlazorWasmMetadataReferenceService.

Convert ProtoBuf byte[] to a JSON string

Dependency Injection

public class Program
{
    public static async Task Main(string[] args)
    {
        // ...

        // Add AddSingleton registrations for the IMetadataReferenceService and IConverter
        builder.Services.AddSingleton<IMetadataReferenceService, BlazorWasmMetadataReferenceService>();
        builder.Services.AddSingleton<IConverter, Converter>();

        await builder.Build().RunAsync();
    }
}

Blazor Page

public partial class Home
{
    [Inject]
    public required IConverter Converter { get; set; }

    private State _state = State.None;
    private string _protoDefinition = "..."; // See above
    private string _messageType = "greet.HelloRequest";
    private string _protobufAsBase64 = "CgRzdGVm";
    private bool _skipGrpcHeader = true;
    private bool _addGrpcHeader = true;
    private string _json = string.Empty;

    private async Task OnClick()
    {
        await ConvertToJsonAsync();
    }

    private async Task ConvertToJsonAsync()
    {
        _json = string.Empty;

        var bytes = Convert.FromBase64String(_protobufAsBase64);

        var convertToJsonRequest = new ConvertToJsonRequest(_protoDefinition, _messageType, bytes)
            .WithSkipGrpcHeader(_skipGrpcHeader)
            .WithWriteIndented();

        _json = await Converter.ConvertAsync(convertToJsonRequest);
    }
}

For a full example, see examples/ProtoBufJsonConverter.Blazor.


Examples

Badges
Extracted from project README
NuGet Badge
Related Projects