C# ReadAsStringAsync返回虚线描述
我有一个ReadJsonUrl方法,它获取JSON文件的url(字符串地址(例如:)) 此方法读取JSON并在控制台中输出一些数据 但问题是,产品的描述输出如下 史密斯尼伯公司在帕斯卡的克鲁斯隆酒店 但如果我在浏览器中检查JSON,它会显示 史密斯公司在克鲁斯·隆德·帕普里卡(kruis rond paprika)附近发现了它 这就是我想要的打印方式 我认为问题在于,请求是通过0px×0px分辨率的浏览器完成的,因此它返回被分割的单词以保持可读性。如果我让我的浏览器非常小,那么它也会显示带有破折号的描述。 我在代码中添加了一个用户代理,但没有成功 有人知道如何解决这个问题吗 我的代码:C# ReadAsStringAsync返回虚线描述,c#,json,dotnet-httpclient,C#,Json,Dotnet Httpclient,我有一个ReadJsonUrl方法,它获取JSON文件的url(字符串地址(例如:)) 此方法读取JSON并在控制台中输出一些数据 但问题是,产品的描述输出如下 史密斯尼伯公司在帕斯卡的克鲁斯隆酒店 但如果我在浏览器中检查JSON,它会显示 史密斯公司在克鲁斯·隆德·帕普里卡(kruis rond paprika)附近发现了它 这就是我想要的打印方式 我认为问题在于,请求是通过0px×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;
}
}
公共静态异步任务ReadJsonUrl(字符串地址)
{
使用(HttpClient=new HttpClient())
{
client.DefaultRequestHeaders.Add(“用户代理”、“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/57.0.2987.133 Safari/537.36”);
HttpResponseMessage response=wait client.GetAsync(地址);
var content=await response.content.ReadAsStringAsync();
//JObject obj=JObject.Parse(内容);
var data=Empty.FromJson(内容);
var product=data.Embedded.Lanes[4]。Embedded.Items[0]。Embedded.product;
控制台写入线(产品Id);
控制台写入线(产品描述);
Console.WriteLine(product.pricelab.Now);
Console.WriteLine(产品、可用性、标签);
Console.WriteLine(“---------------------------------------”;
系统线程线程睡眠(5000);
//返回值供以后使用
退货产品;
}
}
如果将第二个字符串(预期输出)复制并粘贴到十六进制编辑器中,它将告诉您该字符串包含0xAD
字符。这些是
Internet Explorer或Firefox等浏览器仅在必要时(换行时)才会显示这些软连字符,但控制台每次都会显示这些软连字符
为了补充Thomas Weller的答案,这很好地解释了问题,这里有一个函数,它将从
字符串
中去掉所有软连字符。它是作为扩展方法编写的,因此您可以像这样轻松地使用它:
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中,有两种类型的连字符:普通连字符和软连字符。用户代理应将普通连字符解释为另一个字符。软连字符告诉用户代理可能发生换行的位置。那些解释软连字符的浏览器必须遵守以下语义。如果一行在软连字符处断开,则必须在第一行末尾显示连字符。如果行未在软连字符处断开,则用户代理不得显示连字符。对于搜索和排序等操作,应始终忽略软连字符
什么是空的。FromJson()?请提供。Json请求不知道它来自0x0浏览器,因此不会影响数据。这要么是
Empty.FromJson()
(正如Thomas所说,这是什么?)的问题,要么是浏览器如何显示它(您是如何做到的?)。如果您认为这是0x0浏览器的问题,请尝试从500x500浏览器调用它,看看是否有任何问题impact@ThomasWeller我从这个网站上得到了空的.FromJson():我把它复制到记事本+,它也会显示出来。所以,如果我只是把数据发布到数据库中,然后用浏览器读取,我应该会没事的?@valheru:是的。否则,您也可以过滤软连字符。谢谢,我会尝试一下,并在一切正常时通知您。只需添加一些额外的信息:软连字符用于向浏览器提示在需要换行时可以安全地拆分单词的位置。如果单词没有断开,则不会显示连字符,但如果它断开,浏览器将在字符串中搜索回它可以断开的内容。它更喜欢单词中的软连字符,在那里打断它,然后显示连字符。