我如何查看从 GSON JsonReader 收到了多少字节

Posted

技术标签:

【中文标题】我如何查看从 GSON JsonReader 收到了多少字节【英文标题】:How can i see how many bytes was received from GSON JsonReader 【发布时间】:2013-02-14 02:09:59 【问题描述】:

在阅读here 并使用 JsonWriter 和 JsonReader 创建一个要发送和接收的大型对象时。我想跟踪发送的总字节数。

【问题讨论】:

【参考方案1】:

JsonWriterJsonReader 中没有任何内容可以为您提供这些。

真正做到这一点的唯一方法是包装/扩展您当前传递给JsonReader/JsonWriterReaderWriter 并跟踪正在读取/写入/输出的字节.

编辑添加:例如,您可以执行以下操作:

class MyWriterWrapper extends Writer 

    private Writer realWriter;
    private int bytesWritten;

    public MyWriterWrapper(Writer realWriter) 
        super(); 
        this.realWriter = realWriter;
    

    public int getBytesWritten() 
        return bytesWritten;
    

    @Override
    public Writer append(CharSequence csq) throws IOException 
         realWriter.append(csq);
         bytesWritten += csq.length();
         return this;
    

    // Implement/Override all other Writer methods the same way


如果Writer 是一个界面,那会更干净,但是……嗯,你能做什么。如果你知道你只会使用一种类型的Writer(比如BufferedWriter),你可以扩展它,覆盖所有方法并重新调用this上的方法而不是私有@987654332 @instance 通过构造函数传入。

【讨论】:

这是我的想法。如果有一个具有此功能的 gson 克隆,那就太好了,如果我能做到这一点,我会升级一个 这仅适用于Writer,不适用于Reader。【参考方案2】:

没有从 JsonReader 获取接收字节数的默认方法。我写了一个小技巧,下面提到:

    从输入流中读取字节并将它们写入内部存储文件

    while ((count = inputStream.read(data)) != -1)  
                  total += count;
                  final long downloadedLength = total;
                  final long totalLength = lengthOfData;
               **// Here you get the size of bytes received**
                  outStream.write(data, 0, count);
              
    

    关闭所有打开的流(上面创建的输入和输出流)

    打开新建文件的输入流

    InputStream 流 = mContext.openFileInput(FILE_NAME); InputStreamReader inputStreamReader = new InputStreamReader(stream);

    现在您有了 JsonReader 的输入流(流)

    让 JsonReader 使用这个输入流来解析数据

    解析完成后,删除你创建的临时使用的文件

    InputStream 流 = mContext.openFileInput(FILE_NAME); InputStreamReader inputStreamReader = new InputStreamReader(stream); jsonReader = 新的 JsonReader(inputStreamReader); parseMyJSON(jsonReader);

    文件 file = new File(mContext.getFilesDir(), FILE_NAME); 文件.delete();

【讨论】:

【参考方案3】:

没办法。即使您将输入流包装在某种包装器中以计算字节数(例如 apache 的 CountingInputStream),由于 JsonReader 的内部缓冲,结果也会不正确。我已经尝试了大约 300 字节长的 JSON。 CountingInputStream 报告每次读取约 4kb。

【讨论】:

以上是关于我如何查看从 GSON JsonReader 收到了多少字节的主要内容,如果未能解决你的问题,请参考以下文章

Gson使用google的JsonReader读取Json文件并转化成对象

Gson全解析之一:JsonReader的beginObject()

Gson全解析之二:JsonReader的其它方法

com.google.gson.stream.MalformedJsonException:使用 JsonReader.setLenient(true) 在将 Selenium Grid 节点注册到

Retrofit com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept

如何解决gson.fromJson()在android中有错误