我正在开发一个新闻应用程序为Windows 8(在C#,XAML)。 不幸的是我下载一个JSON进纸(带验证后遇到了一个奇怪的错误http://jsonlint.com/ )异步。 下载成功,然后我想分析的结果: var items = Windows.Data.JsonArray.Parse(result);
。
当我运行的代码中,我得到以下错误:
Invalid character at position 0.
和Invalid JSON string.
Json.JsonArray是微软一个新的图书馆。 我也试过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));
此代码段是从微软动手实验室(Contoso的食谱)。 我也试了一下没有源代码中的“[”和“]”(无效果)...
谢谢!
我可以一个小的修改后运行代码。 在UTF8字符串的字节顺序标记似乎引发一个问题,从Windows.Data.Json JsonArray.Parse()。
来解决这个问题,而无需使用附加的编码的一种方式是后ReadAsStringAsync(),例如,以取代BOM字符
result = result.Replace('\xfeff', ' ');
或更好
if (result.Length > 1 && result[0] == '\xfeff'){
result = result.Remove(0, 1);
}
我能精细下载并解析结果,使用这个:
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
与消息: Encountered unexpected character 'ï'.
。