YamlDotNet "Ожидается StreamEnd, получен DocumentStart" при чтении строки - PullRequest
0 голосов
/ 12 ноября 2018

Я использую YamlDotNet с функцией Azure v2 для сериализации YAML из файла уценки (размещенного на GitHub) в объект .net. Я борюсь с этой ошибкой при попытке десериализации строки YAML

Expected 'StreamEnd', got 'DocumentStart

Я получаю содержимое файла уценки, используя HttpClient с GET-запросом к https://github.com/martinkearn/Content/raw/fd83bf8218b7c5e01f8b498e8a831bcd3fc3c961/Blogs/Test.md, который возвращает необработанный файл уценки в теле ответа.

Моя модель

public class Article
{
    public string Title { get; set; }
    public string Author { get; set; }
    public List<string> Categories { get; set; }
}

Мой YAML

---
title: Test File 
author: Martin Kearn  
categories:
  - Test
  - GitHubCMS 
  - One More Tag
  - another tag
---

Вот мой код

// get url from request body
var url = "https://raw.githubusercontent.com/martinkearn/Content/fd83bf8218b7c5e01f8b498e8a831bcd3fc3c961/Blogs/Test.md";

// get raw file and extract YAML
using (var client = new HttpClient())
{
    //setup HttpClient
    client.BaseAddress = new Uri(url);
    client.DefaultRequestHeaders.Add("User-Agent", "ExtractYAML Function");

    //setup httpContent object
    var response = await client.GetAsync(url);

    string rawFile = await response.Content.ReadAsStringAsync();
    using (var r = new StringReader(rawFile))
    {
        var deserializer = new DeserializerBuilder()
            .WithNamingConvention(new CamelCaseNamingConvention())
            .Build();

        //This line is causing Expected 'StreamEnd', got 'DocumentStart'
        var article = deserializer.Deserialize<Article>(r);
    }
}

1 Ответ

0 голосов
/ 12 ноября 2018

Фактически загруженный файл содержит:

---
title: Test File 
author: Martin Kearn  
categories:
  - Test
  - GitHubCMS 
  - One More Tag
  - another tag
---

# Test file

--- - маркер конца директивы, который необязателен, если у вас нет директив (%YAML 1.2, %TAG ....).

Поскольку после второй директивы у вас есть пустая строка, это считается, как если бы ваш второй документ содержал

---
null
# Test file

Вы должны хотя бы избавиться отэта пустая строка и, возможно, удаляет второй маркер конца директив, помещая комментарий в конец первого документа

Индикатор конца документа в YAML равен ... в начале строки.

Сделайте так, чтобы ваш файл читался:

title: Test File 
author: Martin Kearn  
categories:
  - Test
  - GitHubCMS 
  - One More Tag
  - another tag
# Test file

или самое большее:

---
title: Test File 
author: Martin Kearn  
categories:
  - Test
  - GitHubCMS 
  - One More Tag
  - another tag
# Test file
...