Skip to main content
.NETFramework4.6.2net6.0net8.0.NETStandard2.0.NETStandard2.1

Convert a protobuf message to a JSON string or object (and back) using the proto definition file.

Published
Oct 15, 2024
2y ago
Total Downloads
27.9M
27,905,610

Install

dotnet add package ProtoBufJsonConverter --version 0.4.0
ProductVersions
.NET
net6.0net8.0
.NET Standard
netstandard2.0netstandard2.1
Other
.NETFramework4.6.2

README

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.

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;
}

:one: Convert ProtoBuf byte[] to a JSON string

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"}

:one: 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);

:three: 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);

:four: Convert any object to a ProtoBuf byte[]

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);

:five: 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 ConvertType _selectedConvertType = ConvertType.ToJson;
    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

Changes from Previous Version

v0.3.0v0.4.0
Added Dependencies
Newtonsoft.Json(.NETFramework4.6.2)
Newtonsoft.Json(.NETStandard2.0)
Newtonsoft.Json(.NETStandard2.1)

Adoption Assessment

Assess this package against its supported frameworks, license, maintenance signals and dependency graph before making it a project standard.

Compatibility metadata lists 5 target frameworks; confirm the exact target used by your application.The published metadata declares 30 direct dependency entries across framework groups. Inspect the resolved dependency graph for your target framework.

Related Guides & Workflows

Learn how to evaluate, integrate, or audit this package in your .NET project.