【问题标题】:ReadAsStringAsync returns dashed descriptionReadAsStringAsync 返回虚线描述
【发布时间】:2018-01-03 12:57:59
【问题描述】:

我有一个方法 ReadJsonUrl,它获取一个 JSON 文件的 url(字符串地址(例如:https://www.ah.nl/service/rest/delegate?url=%2Fproducten%2Fproduct%2Fwi224732%2Fsmiths-nibb-it-happy-ones-kruis-rond-paprika))。

此方法读取 JSON 并在控制台中输出一些数据。

但问题是产品的描述输出像

Smiths Nibb-it hap-py on-es kruis-rond pa-pri-ka

但如果我在浏览器中检查 JSON,它会显示

Smiths Nibb-it 快乐的 kruis-rond 辣椒粉

这就是我想要的打印方式。

我认为问题在于,请求是使用 0px x 0px 分辨率的浏览器完成的,因此它返回的单词被分割以保持可读性。如果我让我的浏览器非常小,那么它也会用破折号显示描述。 我在代码中添加了一个用户代理,但这不起作用。

有人知道如何解决这个问题吗?

我的代码:

    public static async Task<object> ReadJsonUrl(string address)
    {
        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36");

            HttpResponseMessage response = await client.GetAsync(address);
            var content = await response.Content.ReadAsStringAsync();
            //JObject obj = JObject.Parse(content);


            var data = Empty.FromJson(content);

            var product = data.Embedded.Lanes[4].Embedded.Items[0].Embedded.Product;

            Console.WriteLine(product.Id);
            Console.WriteLine(product.Description);
            Console.WriteLine(product.PriceLabel.Now);
            Console.WriteLine(product.Availability.Label);
            Console.WriteLine("-------------------------------------");

            System.Threading.Thread.Sleep(5000);

            //the return value is for later use
            return product;

        }

    }

【问题讨论】:

  • 什么是Empty.FromJson()?请提供minimal reproducible example
  • Json 请求不知道它来自 0x0 浏览器,因此不会影响数据。这要么是Empty.FromJson() 的问题(正如 Thomas 所说,这是什么?)或者它是如何从浏览器显示的(你是怎么做的?)。如果您认为这是 0x0 浏览器的问题,请尝试从 500x500 浏览器调用它,看看是否有任何影响
  • @ThomasWeller 我从这个网站得到了 Empty.FromJson():app.quicktype.io/#l=cs&r=json2csharp

标签: c# json dotnet-httpclient


【解决方案1】:

如果您将第二个字符串(预期输出)复制并粘贴到十六进制编辑器中,它会告诉您它有 0xAD 字符。这些是soft hyphens

Internet Explorer 或 Firefox 等浏览器只会在必要时(在换行符处)显示这些软连字符,但控制台每次都会显示。

【讨论】:

  • 我把它复制到notepad++中,它也显示出来了。
  • 所以如果我只是将数据发布到数据库中并使用浏览器读取它应该没问题?
  • @valheru:是的。否则,您还可以过滤软连字符。
  • 谢谢,我会试一试,当一切顺利时会通知您。
  • 只是为了添加一些额外的信息:软连字符用于提示浏览器在需要换行时可以安全地拆分单词的位置。如果单词没有被破坏,则不会显示连字符,但如果它被破坏,浏览器将在字符串中搜索它可以中断的内容。它会更喜欢单词中的软连字符,将其打断,然后显示连字符。
【解决方案2】:

为了补充 Thomas Weller 的回答,很好地解释了这个问题,这里有一个函数可以从 string 中删除所有软连字符。它被编写为扩展方法,因此您可以像这样轻松使用它:

Console.WriteLine(product.Description.RemoveSoftHyphens());

扩展方法:

public static class StringExtensions
{
    public static string RemoveSoftHyphens(this string input)
    {
        var output = new StringBuilder(input.Length);
        foreach (char c in input)
        {
            if (c != 0xAD)
            {
                output.Append(c);
            }
        }
        return output.ToString();
    }
}

作为附加信息,这里是 HTML4 对软连字符使用的描述:

在 HTML 中,有两种连字符:普通连字符和软连字符。普通的连字符应该被用户代理解释为另一个字符。软连字符告诉用户代理在哪里可以发生换行符。那些解释软连字符的浏览器必须遵守以下语义。如果在软连字符处断行,则必须在第一行的末尾显示连字符。如果在软连字符处没有断行,则用户代理不得显示连字符。对于搜索和排序等操作,应始终忽略软连字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2021-07-17
    • 2014-07-02
    • 2013-09-11
    相关资源
    最近更新 更多