.Net Protocol Buffers到JSON,JsonFormatReader类不处理最外面的大括号



我正在使用Google协议缓冲区,使用protobuf-csharp端口库(https://code.google.com/p/protobuf-csharp-port/)。Google.ProtocolBuffers.Serialization类有一个JsonFormatReader/JsonFormatWriter类,当我使用它们时,它们不会在JSON文档中放置开始和结束的大括号,如果我添加开始和结束大括号,它们也无法读取它们编写的同一文档。

例如调用

        PB.ProtoBufMessage message = CreateMyMessage();
        string json;
        using (StringWriter sw = new StringWriter())
        {
            ICodedOutputStream output = JsonFormatWriter.CreateInstance(sw);
            message.WriteTo(output);
            output.Flush();
            json = sw.ToString();
        }

创建:

""field1":"prop1","field2":1,"subitem":{"x":0,"y":0,"z":0}"

如果我试图解析

String jsonmessage = "{"field1":"prop1","field2":1,"subitem":{"x":0,"y":0,"z":0}}"

使用

    PB.ProtoBufMessage copy;
    ICodedInputStream input = JsonFormatReader.CreateInstance(jsonmessage);
    copy = PB.ProtoBufMessage.CreateBuilder().MergeFrom(input).Build();

我得到以下信息:

(1:1) error: Unexpected token '{', expected: '"'.
   at Google.ProtocolBuffers.Serialization.JsonCursor.Assert(Boolean cond, Char expected)
   at Google.ProtocolBuffers.Serialization.JsonCursor.Consume(Char ch)
   at Google.ProtocolBuffers.Serialization.JsonCursor.ReadString()
   at Google.ProtocolBuffers.Serialization.JsonFormatReader.PeekNext(String& field)
   at Google.ProtocolBuffers.Serialization.AbstractReader.Google.ProtocolBuffers.ICodedInputStream.ReadTag(UInt32& fieldTag, String& fieldName)
   at ...

为什么缺少{},这是有效的JSON吗?

您需要编写/读取消息的开始/结束。类似:

output.WriteMessageStart();
message.WriteTo(output);
output.WriteMessageEnd();

相似的阅读方式:

input.ReadMessageStart();
builder.MergeFrom(input);
input.ReadMessageEnd();

上面的代码适用于json和二进制读写器。

最新更新