C# JsonArray.Parse(…)错误
我正在为Windows8开发一个新闻应用程序(用C#,XAML)。不幸的是,在异步下载JSON提要(通过验证)后,我遇到了一个奇怪的错误。下载成功,然后我想解析结果:C# JsonArray.Parse(…)错误,c#,windows,json,windows-runtime,arrays,C#,Windows,Json,Windows Runtime,Arrays,我正在为Windows8开发一个新闻应用程序(用C#,XAML)。不幸的是,在异步下载JSON提要(通过验证)后,我遇到了一个奇怪的错误。下载成功,然后我想解析结果:var items=Windows.Data.JsonArray.parse(result) 运行代码时,出现以下错误: 位置0处的无效字符。和无效的JSON字符串。 Json.JsonArray是Microsoft的一个新库。我还尝试了Newtonsoft的JSON库,但出现了相同的错误。我做错了什么 这是完整的代码: // Re
var items=Windows.Data.JsonArray.parse(result)代码>
运行代码时,出现以下错误:
位置0处的无效字符。
和无效的JSON字符串。
Json.JsonArray是Microsoft的一个新库。我还尝试了Newtonsoft的JSON库,但出现了相同的错误。我做错了什么
这是完整的代码:
// Retrieve recipe data from Azure
var client = new HttpClient();
client.MaxResponseContentBufferSize = 1024*1024; // Read up to 1 MB of data
var response = await client.GetAsync(new Uri("http://contosorecipes8.blob.core.windows.net/AzureRecipes"));
var result = await response.Content.ReadAsStringAsync();
// Parse the JSON recipe data
var recipes = JsonArray.Parse(result.Substring(1, result.Length - 1));
此代码段来自Microsoft的动手实验室(Contoso CookBook)。我还尝试了在源代码中没有“[”和“]”的情况下使用它(没有效果)
谢谢大家! 我可以通过以下方式下载并解析结果:
static async Task<JsonValue> DownloadJsonAsync(string url)
{
var client = new HttpClient();
client.MaxResponseContentBufferSize = 1024 * 1024;
var data = await client.GetByteArrayAsync(new Uri(url));
var encoding = Encoding.UTF8;
var preamble = encoding.GetPreamble();
var content = encoding.GetString(data, preamble.Length, data.Length - preamble.Length);
var result = JsonValue.Parse(content);
return result;
}
静态异步任务下载JSONASync(字符串url)
{
var client=新的HttpClient();
client.MaxResponseContentBufferSize=1024*1024;
var data=await client.GetByteArrayAsync(新Uri(url));
var encoding=encoding.UTF8;
var preamble=encoding.GetPreamble();
var content=encoding.GetString(数据,preamble.Length,data.Length-preamble.Length);
var result=JsonValue.Parse(内容);
返回结果;
}
响应中的BOM表显然没有正确处理,这导致解析器在开始时出现'\xfeff'
字符。去掉序言并进行解析就可以了。否则,按原样解析会抛出一个格式异常
,并显示一条消息:遇到了意外的字符“ï”。
经过一点修改后,我就可以运行您的代码了。UTF8字符串的字节顺序标记似乎触发了Windows.Data.Json中JsonArray.Parse()的问题
在不使用额外编码的情况下解决此问题的一种方法是在readAsTringAsync()之后替换BOM字符,例如
或者更好
if (result.Length > 1 && result[0] == '\xfeff'){
result = result.Remove(0, 1);
}
你能分享一个数据的例子吗?这是来自实验室的示例数据。他们在JSON字符串的开头和结尾添加了“[”和“]”(原因未知),并将其删除(请参见子字符串)。谢谢@casaout[
和]
的存在有一个很好的理由:响应是一个数组,这就是JSON中数组的外观。而您的子字符串()
从开头删除一个字符,但不会从结尾删除任何内容。
if (result.Length > 1 && result[0] == '\xfeff'){
result = result.Remove(0, 1);
}