【问题标题】:Deserializing JSON from webpages - Always the wrong Syntax?从网页反序列化 JSON - 总是错误的语法?
【发布时间】:2021-03-05 11:50:33
【问题描述】:

我正在尝试抓取页面,找到它们的 schema.org 脚本,然后对其进行反序列化。

我能够找到脚本,但是,有效的 JSON 架构(根据 Google/schema.org)在大多数 Json Validator 工具中应该是无效的。

例如,这是我的代码

    string Url = "https://www.independent.co.uk/news/health/nhs-pay-health-coronavirus-unions-b1812659.html";
    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(Url);
    var scripts = doc.DocumentNode.SelectNodes("//script");
    foreach (HtmlNode node in scripts)
    {
        string value = node.InnerText;
        if (value.Contains("schema.org"))
        {
            dynamic results = JsonConvert.DeserializeObject<dynamic>(value);
            var name = results.name;
        }
    }

找到以下 Schema (JSON)

{{
  "@type": "Organization",
  "@context": "https://schema.org",
  "name": "The Independent",
  "url": "https://www.independent.co.uk",
  "logo": {
    "@type": "ImageObject",
    "url": "https://www.independent.co.uk/img/logo.png",
    "width": 504,
    "height": 60
  },
  "sameAs": [
    "https://twitter.com/Independent",
    "https://www.facebook.com/TheIndependentOnline"
  ]
}}

#1 JSON 被认为是无效的,即使每个使用结构化数据的网站都这样使用它

#2 当我尝试获取名称值时,它返回 null。

我认为我的问题是因为 JSON 无效。我该如何进行这项工作?我没有想法。

【问题讨论】:

  • 这里的问题是对象周围的额外花括号。 Json 对象需要具有属性,如果您的对象中嵌套了另一个对象,则它不是有效的 json,如下所示:{ } 是一个有效的空 json 对象。但是,这无效:{{ }}.

标签: c# json .net json-deserialization


【解决方案1】:

您需要去掉 JSON 开头和结尾处多余的大括号,使其成为有效的 JSON。

【讨论】:

  • 请问,为什么 schema.org 会告诉我们这样格式化?另外,为什么 Google 会在验证测试中通过它?
  • 它不应该告诉您像检查该网站的源代码那样格式化,您可以看到架构开始如下:
  • 另外,如果您指的是这个 google 工具 - search.google.com/structured-data/testing-tool 它对我来说没有通过检查?
  • 我刚刚通过调试意识到......当我序列化为“结果”时,它会添加额外的卷曲。我以为我最初是这样刮的。为什么它会那样做,grr。
  • 哈哈很高兴我能提供帮助。祝你好运!
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
相关资源
最近更新 更多