簡體   English   中英

protobuf3 JsonFormat InvalidProtocolBufferException無法識別的字符

[英]protobuf3 JsonFormat InvalidProtocolBufferException Unrecognized character

我正在嘗試將json轉換為原始消息對象,但是如果json中有一些字符,例如$或。 或_我收到InvalidProtocolBufferException。 我的原型:

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

Java代碼:

 String json = "{\n" +
        "  \"a\" : {\n" +
        "    \"b\" : [ {\n" +
        "      \"c\" : [ {\n" +
        "        \"d\" : {\n" +
        "          \"money\" : [ \"100$\" ]\n" +
        "        }\n" +
        "      } ]\n" +
        "    } ]\n" +
        "  }\n" +
        "}";
    Main.Builder builder = Main.newBuilder();
    JsonFormat.parser().merge(json, builder);
    System.out.println(builder.build());

輸出:

  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<string,bytes> d = 1; 在Java方面將是: Map<String, ByteString>並且在您的Json中,您有一些“看起來像” String-String映射的東西。

讓我們進行快速實驗,嘗試將您的Main類型轉換為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聲明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM