3

我正在为 Windows 8 开发一个新闻应用程序(在 C#、XAML 中)。不幸的是,我在异步下载 JSON-Feed(通过http://jsonlint.com/验证)后遇到了一个奇怪的错误。下载成功,然后我想解析结果:var items = Windows.Data.JsonArray.Parse(result);.

当我运行代码时,出现以下错误:

Invalid character at position 0.Invalid JSON string.

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)。我也试过没有源中的“[”和“]”(没有效果)......

谢谢!

4

2 回答 2

6

我可以使用以下方法下载并解析结果:

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

响应中的 BOM 显然没有正确处理,这导致一个'\xfeff'字符在开始时杀死了解析器。剥离前导和解析读起来很好。否则,按原样解析它会抛出FormatException带有消息的 a:Encountered unexpected character 'ï'.

于 2012-06-08T16:13:49.137 回答
1

稍作修改后,我就可以运行您的代码。UTF8 字符串的字节顺序标记似乎触发了来自 Windows.Data.Json 的 JsonArray.Parse() 问题。

在不使用额外编码的情况下解决它的一种方法是在 ReadAsStringAsync() 之后替换 BOM 字符,例如

result = result.Replace('\xfeff', ' ');

或更好

if (result.Length > 1 && result[0] == '\xfeff'){
    result = result.Remove(0, 1);
}
于 2012-06-08T18:08:06.070 回答