为什么我的Azure Blob存储中的文本文件中的文本在下载时未正确格式化?

时间:2018-07-29 02:29:53

标签: asp.net asp.net-mvc azure-storage-blobs azure-blob-storage

............................................... ................................

更新

在以下注释的指导下,我发现在调试器中查看的实际上是正确的JSON。但是,从Blob返回的文本不是全文-文件末尾缺少一小部分字符。

我正在使用JsonConvert创建此文本文件,该文件最终以JSON形式作为ViewModel的序列化版本。

我最终解决了缺少文本的问题,是更改了将文本上传到Blob的方式。我从中更改了代码:

Stream memoryStream = new MemoryStream();

TextWriter textWriter = new StreamWriter(memoryStream);

textWriter.WriteLine(serializedViewModel);

memoryStream.Position = 0;

blob.UploadFromStream(memoryStream);

对此

var options = new BlobRequestOptions()
{
    ServerTimeout = TimeSpan.FromMinutes(10)
};

using (var memoryStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(serializedViewModel), false))
{
    blob.UploadFromStream(memoryStream, null, options);
}

我不知道为什么第一种方法不起作用,但是现在全文已上传到Blob,并且可以下载和使用。

............................................... .................................

当我将这样的内容作为文本文件上传时(可以从Storage Explorer手动下载并以.txt文件的形式在记事本中查看)...

{
  "$id": "1",
  "ReportBuilderModel": null,
  "ReportBuilderModelId": 0,
  "ReportSections": [
 {
  "$id": "2",
  "ReportSectionModel": {
    "$id": "3",
    "SectionFile": null,
    "Id": 1182,
    "ReportBuilderModelId": 36,
    "SectionName": "Issue Summary",
    "SectionType": 6,
    "Position": 0,
    "ParentSectionId": null,
    "TimeOfReport": "2018-07-28T04:56:38.93",
  }
}

...使用此代码...

Stream memoryStream = new MemoryStream();
TextWriter textWriter = new StreamWriter(memoryStream);

textWriter.WriteLine(serializedViewModel);

// Get container reference.
blobContainer = blobClient.GetContainerReference("containerReference");

// Create the container if it doesn't already exist.
blobContainer .CreateIfNotExists();

memoryStream.Position = 0;

blockBlob = textFileContainer.GetBlockBlobReference("containerReference");

blockBlob.UploadFromStream(memoryStream);

...以及使用此代码从Blob存储下载文件时...

using (var memoryStream = new MemoryStream())
{
    blockBlob.DownloadToStream(memoryStream);

    string serializedData = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
}

... serializedData看起来像这样...

“ {\ r \ n \” $ id \“:\” 1 \“,\ r \ n \” ReportBuilderModel \“:空,\ r \ n \” ReportBuilderModelId \“:0,\ r \ n \“ ReportSections \”:[\ r \ n {\ r \ n \“ $ id \”:\“ 2 \”,\ r \ n \“ ReportSectionModel \”:{\ r \ n \“ $ id \” :\“ 3 \”,\ r \ n \“ SectionFile \”:null,\ r \ n ...

请帮助。

1 个答案:

答案 0 :(得分:1)

有时某些字符需要转义,这就是为什么JSON文件看起来像现在这样的原因。在您的情况下,JSON字符串中的引号(“)是需要转义的字符。

如果格式确实对您很重要,则只需替换不必要的字符,例如...

string str = "{\r\n \"$id\": \"1\",\r\n \"ReportBuilderModel\": null,\r\n \"ReportBuilderModelId\": 0,\r\n \"ReportSections\": [\r\n {\r\n \"$id\": \"2\",\r\n \"ReportSectionModel\": {\r\n \"$id\": \"3\",\r\n \"SectionFile\": null,\r\n ...";
str = str.Replace("\"", "");

如果您也想摆脱line feedcarriage return,则可以像以前一样这样做:

str = str.Replace("\r\n", "");

之后,str的值为:

"{ $id: 1, ReportBuilderModel: null, ReportBuilderModelId: 0, ReportSections: [ { $id: 2, ReportSectionModel: { $id: 3, SectionFile: null, ..."
  

在计算和电信中,转义字符是一个字符   这将对后续字符进行替代解释   按字符顺序。转义字符是   元字符。通常,判断某物是否为   是否转义字符取决于上下文。

     

来源:https://en.wikipedia.org/wiki/Escape_character