【问题标题】:YamlDotNet "Expected 'StreamEnd', got 'DocumentStart'"when reading stringYamlDotNet“预期'StreamEnd',读取字符串时得到'DocumentStart'”
【发布时间】:2019-04-15 08:29:39
【问题描述】:

我正在使用带有 Azure Function v2 的 YamlDotNet 将 YAML 从 Markdown 文件(托管在 GitHub 上)序列化为 .net 对象。我在尝试反序列化 YAML 字符串时遇到此错误

Expected 'StreamEnd', got 'DocumentStart

我正在使用HttpClient 获取降价文件内容,并通过对https://github.com/martinkearn/Content/raw/fd83bf8218b7c5e01f8b498e8a831bcd3fc3c961/Blogs/Test.md 的GET 请求在响应正文中返回原始降价文件。

我的模特是

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);
    }
}

【问题讨论】:

    标签: yaml azure-functions yamldotnet


    【解决方案1】:

    您实际下载的文件包含:

    ---
    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
    

    【讨论】:

    • 谢谢...。我想在 Markdown 文件的开头使用 YAML 作为元数据块,其中包含其他 Markdown 内容(GitHub 风格的 Markdown)。构建这个的正确方法是什么?我已经更新了区域问题中列出的文件以显示更多降价以显示我的意思
    • 我已经设法通过砍掉降价内容并只留下 eth yaml 来使其工作,然后可以使用var yaml = response.Substring(0, response.LastIndexOf("---")); 对其进行序列化……这是我需要做的吗? YamlDotNet 不处理包含 YAML 以外内容的文档吗?
    • 我不了解 YamlDotnet,但我使用过的所有其他解析器都需要提供 A) 只是 YAML B) 需要预先告知是否有一个或多个文档可用流。它们都需要拆分 YAML“标头”,然后仅解析标头
    • 好的,谢谢。在您的主要答案和 cmets 线程之间,我们得到了我认为的答案;解析器只需要提供 YAML,它应该是有效的 YAML,没有 --- 在错误的位置。我不能真正将您的答案标记为“答案”,因为它不会向未来的任何人讲述完整的故事。如果您可以更新它以包含仅显示 YAML 的详细信息,并且可能包含我提到的代码行,我会将其标记为答案。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多