【问题标题】:unexpected char when parsing json string解析json字符串时出现意外字符
【发布时间】:2022-01-01 10:18:06
【问题描述】:

我正在将一个对象序列化为流以存储为文件,然后检索并尝试反序列化该对象,但解析时出错。下面是代码:

var content = JsonConvert.SerializeObject(data);
var output = new MemoryStream();
var writer = new StreamWriter(output, Encoding.UTF8);
writer.Write(content);
writer.Flush();
//write to some file...


//when reading the file
Stream filestream;
//filestream opens some file stream
byte[] buffer = new byte[4096]
using(MemoryStream ms = new MemoryStream()){
int read;
while((read = filestream.Read(buffer, 0, buffer.Length)) > 0){
ms.Write(buffer, 0, read);
}
var data = Encoding.UTF8.GetString(ms.ToArray());
//encounters error here. I can see that first few chars of the string are question marks.
JsonConvert.DeserializeObject<T>(data);

【问题讨论】:

  • 我最快的猜测是你的缓冲区太小而且内容大于 4096 字节,所以你没有读回整个内容。
  • 旁白:我希望这是伪代码,因为你需要using 块。您可以使用CopyTo 而不是循环

标签: c# .net json.net


【解决方案1】:

几个想法。你有例外吗?

尝试将您的写入和读取封装到函数中,并将 memoryStream 和 streamWriter 包装在 using 语句中

using var writer = new StreamWriter(...

此外,您不需要将缓冲区的长度设置为 4096,这可能会弄乱您的编码。像这样将你的内存流读取到一个数组中

var buffer = ms.ToArray();

How can I write MemoryStream to byte[]

您在 2 个内存流之间复制内存时似乎遇到了问题。理想情况下,您将写入和读取文件或其他源,而不是在 2 个内存流对象之间,但您可以使用 copyto 直接复制内容

https://docs.microsoft.com/en-us/dotnet/api/system.io.stream.copyto?view=net-6.0

编辑:添加伪代码

假设您的内容已被读入 Stream filestream;

using var MemoryStream ms = new MemoryStream();
filestream.CopyTo(ms);
var data = Encoding.UTF8.GetString(ms.ToArray());
return JsonConvert.DeserializeObject<T>(data);

【讨论】:

  • 是的,我首先将它放入 S3,然后再阅读它。我将两者结合起来以保持简短,并且只发布了相关部分。
  • 你把它弄得太复杂了。您不需要做任何循环,只需将您的 Stream 文件流复制到链接中的 MemoryStream 并在 memorystream 上调用 ToArray 以获取字节。
猜你喜欢
  • 2020-07-22
  • 2017-04-10
  • 2023-02-08
  • 1970-01-01
  • 2016-11-14
  • 2013-05-31
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多