JsonSerializer无法从StreamReader读取流

时间:2012-12-29 12:14:57

标签: c# json stream streamreader

我无法让 DataContractJsonSerializer 对象吞下我的流。当我执行带有注释掉的行的代码时,我会看到提供的文本(并且它是一个可解析的JSON对象),所以我知道流工作正常。

但是,出于某种原因,编译器抱怨 streamReader 我试图在 ReadObject 中sh is is是 Stream 。好吧,不是吗?!

  

参数1:无法从'System.IO.StreamReader'转换为'System.IO.Stream'

我缺少什么,如何解决?

using (StreamReader streamReader = new StreamReader(...))
{
  //String responseText = reader.ReadToEnd();
  MyThingy thingy = new MyThingy();
  DataContractJsonSerializer serializer 
    = new DataContractJsonSerializer(thingy.GetType());
  thingy = serializer.ReadObject(streamReader);
}

我正在调整this example以使用我的流。我应该从不同的角度来看待它吗?如果是这样 - 怎么样?

3 个答案:

答案 0 :(得分:1)

你可以试试这个:

using (StreamReader streamReader = new StreamReader(...))
{
  DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(MyThingy));
  MyThingy thingy = (MyThingy) serializer.ReadObject(streamReader.BaseStream);
}

答案 1 :(得分:1)

您尝试输入流的读者而不是实际的流。跳过using以及省略号后面的任何隐藏(即,当您创建StreamReader的实例时,无论您将其作为参数放入什么内容),您都可以将其放入ReadObject

此外,您在阅读数据时会遇到问题,因为ReadObject会返回Object类型的实例,您需要将其转换为MyThingy。因为它是可以为空的(我在假设),所以你不必输入强制转换,而是将其视为as-ify。

MyThingy thingy = new MyThingy();
DataContractJsonSerializer serializer 
  = new DataContractJsonSerializer(thingy.GetType());
Stream stream = ...;
thingy = serializer.ReadObject(stream) as MyThingy;

您当然可以跳过倒数第二行并将流直接放入最后一行。

由@JohanLarsson提供(所有瑞典人都很棒,特别是来自斯德哥尔摩的人,像我一样):
如果您不能或不想在StreamReader声明中省略using声明,我建议您查看BaseStream属性以获取它。

答案 2 :(得分:0)

我一直在使用这个:

 // get stuff here
 String json = GetJSON();

 List<T> result;
 using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
 {
      var serializer = new DataContractJsonSerializer(typeof(List<T>));
      result = (List<T>)serializer.ReadObject(ms);
 }