Java protobuf3 JsonFormat InvalidProtocolBufferException无法识别的字符

Java protobuf3 JsonFormat InvalidProtocolBufferException无法识别的字符,java,gson,protocol-buffers,guava,proto3,Java,Gson,Protocol Buffers,Guava,Proto3,我试图将json转换为proto消息对象,但如果有 json中的字符,如$or。或者,我得到一个无效的RotocolBufferException。 我的原型: syntax = "proto3"; package messages; option java_multiple_files = true; message Main { A a = 1; } message A { repeated B b = 1; } message B { repeated C

我试图将json转换为proto消息对象,但如果有 json中的字符,如$or。或者,我得到一个无效的RotocolBufferException。 我的原型:

syntax = "proto3";

package messages;
option java_multiple_files = true;

message Main {
    A a = 1;
}

message A {
    repeated B b = 1;
}

message B {
    repeated C c = 1;
}

message C {
    map<string, bytes> d = 1;
}
输出:

  com.google.protobuf.InvalidProtocolBufferException: com.google.common.io.BaseEncoding$DecodingException: Unrecognized character: $

        at com.google.protobuf.util.JsonFormat$ParserImpl.merge(JsonFormat.java:1065)
        at com.google.protobuf.util.JsonFormat$Parser.merge(JsonFormat.java:273)

在我看来,你的问题与类型C的声明有关,在它的原型定义中,你有
map d=1在Java端将是:
Map
,在Json中有一些“看起来像”字符串映射

让我们做一个快速的实验,并尝试将您的主类型转换为json:

Main main = Main.newBuilder().setA(
        A.newBuilder().addB(
                B.newBuilder().addC(
                        C.newBuilder().putD("money", 
                                ByteString.copyFrom("100$".getBytes()))
                )
        )
).build();

System.out.println(JsonFormat.printer().print(main));
输出将是

{
  "a": {
    "b": [{
      "c": [{
        "d": {
          "money": "MTAwJA=="
        }
      }]
    }]
  }
}
正如您所看到的,我们没有
100$
,但有编码版本
MTAwJA==
,如果您尝试使用protobuf将此json转换为对象,则不会出现错误


因此,在我看来,在转换为json的过程中对d映射中的值进行编码(或者使用protobuf转换为json),或者更改protobuf声明

能否请您添加有问题的json和用户类型的protobuf定义?我已经完成了,请检查谢谢您,Michal,我已经完成了,我认为在这种情况下,使用JsonFormat将json转换为proto是不可能的。我只想把java.lang.Object映射到proto消息。我有一个带有映射数据的数据对象,我需要使用protobuf发送它。在我看来,如果没有额外的json处理(在发送方),或者没有对proto定义的更改,这是不可能的。在您的情况下,在发送方,您也可以使用protobuf来序列化为json?是的,在双方,我都使用protobuf。无论如何我都能做到,但我还不知道正确的方法。现在我决定把它映射成地图,因为我从那里得到了一个答案-好的,对不起-我一开始不理解你。我假设你的“对象”不可能变成protobuf对象?若不是那个么可能(正如你们在给出的链接中提到的),你们将需要将你们的对象序列化为字节数组eah,这就是我所做的-映射
{
  "a": {
    "b": [{
      "c": [{
        "d": {
          "money": "MTAwJA=="
        }
      }]
    }]
  }
}