.Net 协议缓冲区到 JSON,JsonFormatReader 类不处理最外面的花括号?

Posted

技术标签:

【中文标题】.Net 协议缓冲区到 JSON,JsonFormatReader 类不处理最外面的花括号?【英文标题】:.Net Protocol Buffers to JSON, JsonFormatReader class does not handle outmost curly braces? 【发布时间】:2015-03-31 18:45:32 【问题描述】:

我正在使用 Google 协议缓冲区,使用 protobuf-csharp-port 库 (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 吗?

【问题讨论】:

【参考方案1】:

您需要写/读消息开始/结束。喜欢:

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

类似的阅读方式:

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

以上代码适用于 json 和二进制读取器/写入器。

【讨论】:

以上是关于.Net 协议缓冲区到 JSON,JsonFormatReader 类不处理最外面的花括号?的主要内容,如果未能解决你的问题,请参考以下文章

协议缓冲区如何比 XML 和 JSON 快?

与 JSON 相比,作为协议缓冲区发送时消息的大小如何减小

协议缓冲区 .NET 继承

协议缓冲区 c# (protobuf-net) Message::ByteSize

进出 XPathDocument 的协议缓冲区消息

使用协议缓冲区模拟泛型