【问题标题】:Using DataContractJsonSerializer to create a Non XML Json file使用 DataContractJsonSerializer 创建非 XML Json 文件
【发布时间】:2015-06-30 06:10:21
【问题描述】:

我想使用 DataContractJsonSerializer 序列化为 JsonFormat 文件。 问题是WriteObject方法只有3个选项XmlWriter、XmlDictionaryWriter和Stream。

为了得到我想要的,我使用了以下代码:

var js = new DataContractJsonSerializer(typeof(T), _knownTypes);
using (var ms = new MemoryStream())
{
   js.WriteObject(ms, item);
   ms.Position = 0;
   using (var sr = new StreamReader(ms))
   {
      using (var writer = new StreamWriter(path, false))
      {
         string jsonData = sr.ReadToEnd();
         writer.Write(jsonData);             
       }
   }
}

这是唯一的方法还是我错过了什么?

【问题讨论】:

    标签: c# json serialization datacontractjsonserializer


    【解决方案1】:

    假设您只是想将文本写入文件,不清楚为什么要先将其写入MemoryStream。您可以使用:

    var js = new DataContractJsonSerializer(typeof(T), _knownTypes);
    using (var stream = File.Create(path))
    {
        js.WriteObject(stream, item);
    }
    

    这比较简单,应该做你想做的事......

    【讨论】:

    • 谢谢!昨晚很晚:)...还有一个问题。是否可以缩进 TextFile?因为现在我的队伍很长......
    • @AmitRaz:我不知道,恐怕你可能想考虑使用 Json.NET :)
    • 不幸的是,我尝试使用 Json.NET,因为我们使用 DataContractSerialization 到目前为止,有些人将字典的键设置为元组等,Json.Net 不能很好地处理的事情......
    • @AmitRaz:嗯。从长远来看,我肯定会尝试在转向 Json.NET 方面取得进展。但我很感激这可能不是你现在可以做的事情。
    • 我一直在努力让它工作好几天。问题是 out 应用程序已经发布并安装在客户位置,因此向后兼容性和无数据丢失是必须的.​​.....
    【解决方案2】:

    我实际上很害怕声称知道 Jon Skeet 不知道的东西,但我使用了类似于以下的代码,它生成 Json 文本文件并且保持正确的缩进:

    var js = new DataContractJsonSerializer(typeof(T), _knownTypes);
    using (var stream = File.Create(path))
    {
        using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true, "\t"))
        {
            js.WriteObject(writer, item);
            writer.Flush();
        }
    }
    

    (建议here。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多